@idetik/core 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/core/color.ts","../src/core/renderer.ts","../src/renderers/shaders/projected_line_vert.glsl","../src/renderers/shaders/projected_line_frag.glsl","../src/renderers/shaders/mesh_vert.glsl","../src/renderers/shaders/scalar_image_frag.glsl","../src/renderers/shaders/scalar_image_array_frag.glsl","../src/renderers/shaders/points_vert.glsl","../src/renderers/shaders/points_frag.glsl","../src/renderers/shaders/wireframe_vert.glsl","../src/renderers/shaders/wireframe_frag.glsl","../src/renderers/shaders/volume_vert.glsl","../src/renderers/shaders/volume_frag.glsl","../src/renderers/shaders/label_image_frag.glsl","../src/renderers/shaders/index.ts","../src/utilities/logger.ts","../src/renderers/webgl_shader_program.ts","../src/renderers/webgl_shader_programs.ts","../src/utilities/uuid_generator.ts","../src/core/node.ts","../../../node_modules/gl-matrix/esm/common.js","../../../node_modules/gl-matrix/esm/mat3.js","../../../node_modules/gl-matrix/esm/mat4.js","../../../node_modules/gl-matrix/esm/vec3.js","../../../node_modules/gl-matrix/esm/vec4.js","../../../node_modules/gl-matrix/esm/quat.js","../../../node_modules/gl-matrix/esm/vec2.js","../src/math/box3.ts","../src/core/geometry.ts","../src/renderers/webgl_buffers.ts","../src/renderers/webgl_textures.ts","../src/math/box2.ts","../src/renderers/WebGLState.ts","../src/renderers/webgl_renderer.ts","../src/data/chunk_queue.ts","../src/data/chunk.ts","../src/utilities/almost_equal.ts","../src/core/chunk_store.ts","../src/utilities/clamp.ts","../src/core/chunk_store_view.ts","../src/core/chunk_manager.ts","../src/utilities/vendored/stats.js","../src/utilities/stats.ts","../src/core/layer_manager.ts","../src/core/event_dispatcher.ts","../src/core/viewport.ts","../src/utilities/pixel_size_observer.ts","../src/idetik.ts","../src/core/wireframe_geometry.ts","../src/core/transforms.ts","../src/core/renderable_object.ts","../src/math/plane.ts","../src/math/frustum.ts","../src/objects/cameras/camera.ts","../src/objects/cameras/orthographic_camera.ts","../src/objects/cameras/perspective_camera.ts","../src/objects/cameras/controls.ts","../src/core/layer.ts","../src/objects/geometry/projected_line_geometry.ts","../src/objects/renderable/projected_line.ts","../src/layers/axes_layer.ts","../src/layers/projected_line_layer.ts","../src/layers/tracks_layer.ts","../src/objects/geometry/plane_geometry.ts","../src/objects/textures/texture.ts","../src/core/constants.ts","../src/objects/textures/channel.ts","../src/objects/renderable/image_renderable.ts","../src/objects/textures/texture_2d_array.ts","../src/layers/point_picking.ts","../src/utilities/renderable_pool.ts","../src/layers/chunked_image_layer.ts","../src/objects/textures/texture_3d.ts","../src/objects/geometry/box_geometry.ts","../src/objects/renderable/volume_renderable.ts","../src/layers/volume_layer.ts","../src/layers/image_layer.ts","../src/objects/textures/texture_2d.ts","../src/objects/renderable/label_color_map.ts","../src/objects/renderable/label_image_renderable.ts","../src/layers/label_image_layer.ts","../src/data/promise_scheduler.ts","../src/layers/image_series_loader.ts","../src/layers/image_series_layer.ts","../../../node_modules/@zarrita/core/dist/src/errors.js","../../../node_modules/@zarrita/core/dist/src/codecs/bitround.js","../../../node_modules/@zarrita/typedarray/dist/src/index.js","../../../node_modules/@zarrita/core/dist/src/util.js","../../../node_modules/@zarrita/core/dist/src/codecs/bytes.js","../../../node_modules/@zarrita/core/dist/src/codecs/crc32c.js","../../../node_modules/@zarrita/core/dist/src/codecs/json2.js","../../../node_modules/@zarrita/core/dist/src/codecs/transpose.js","../../../node_modules/@zarrita/core/dist/src/codecs/vlen-utf8.js","../../../node_modules/@zarrita/core/dist/src/codecs.js","../../../node_modules/@zarrita/core/dist/src/codecs/sharding.js","../../../node_modules/@zarrita/core/dist/src/hierarchy.js","../../../node_modules/@zarrita/core/dist/src/open.js","../../../node_modules/@zarrita/storage/dist/src/util.js","../../../node_modules/@zarrita/storage/dist/src/fetch.js","../../../node_modules/@zarrita/indexing/dist/src/util.js","../../../node_modules/@zarrita/indexing/dist/src/indexer.js","../../../node_modules/@zarrita/indexing/dist/src/get.js","../../../node_modules/@zarrita/indexing/dist/src/ops.js","../src/data/zarr/web_file_system_store.ts","../src/data/zarr/open.ts","../src/data/ome_zarr/worker_pool.ts","../src/data/ome_zarr/image_loader.ts","../../../node_modules/zod/lib/index.mjs","../src/data/ome_zarr/0.4/image.ts","../src/data/ome_zarr/0.4/plate.ts","../src/data/ome_zarr/0.4/well.ts","../src/data/ome_zarr/0.5/image.ts","../src/data/ome_zarr/0.5/plate.ts","../src/data/ome_zarr/0.5/well.ts","../src/data/ome_zarr/metadata_loaders.ts","../src/data/ome_zarr/image_source.ts","../src/core/image_source_policy.ts","../src/math/spherical.ts","../src/objects/renderable/points.ts"],"sourcesContent":["import { vec3, vec4 } from \"gl-matrix\";\n\nexport type ColorLike = Color | vec3 | vec4;\n\nexport class Color {\n public static readonly RED: Color = new Color(1.0, 0.0, 0.0);\n public static readonly GREEN: Color = new Color(0.0, 1.0, 0.0);\n public static readonly BLUE: Color = new Color(0.0, 0.0, 1.0);\n public static readonly YELLOW: Color = new Color(1.0, 1.0, 0.0);\n public static readonly MAGENTA: Color = new Color(1.0, 0.0, 1.0);\n public static readonly CYAN: Color = new Color(0.0, 1.0, 1.0);\n public static readonly BLACK: Color = new Color(0.0, 0.0, 0.0);\n public static readonly WHITE: Color = new Color(1.0, 1.0, 1.0);\n public static readonly TRANSPARENT: Color = new Color(0.0, 0.0, 0.0, 0.0);\n\n // RGBA color values in the range [0, 1]\n private readonly rgba_: readonly [number, number, number, number];\n\n constructor(r: number, g: number, b: number, a?: number) {\n if (r < 0 || r > 1 || g < 0 || g > 1 || b < 0 || b > 1) {\n throw new Error(\"RGB values must be in the range [0, 1]\");\n }\n if (a !== undefined && (a < 0 || a > 1)) {\n throw new Error(\"Alpha value must be in the range [0, 1]\");\n }\n this.rgba_ = [r, g, b, a ?? 1.0];\n }\n\n public get rgb(): [number, number, number] {\n return [this.rgba_[0], this.rgba_[1], this.rgba_[2]];\n }\n\n public get rgba(): readonly [number, number, number, number] {\n return this.rgba_;\n }\n\n public get r(): number {\n return this.rgba_[0];\n }\n\n public get g(): number {\n return this.rgba_[1];\n }\n\n public get b(): number {\n return this.rgba_[2];\n }\n\n public get a(): number {\n return this.rgba_[3];\n }\n\n public get rgbHex(): string {\n return `#${this.toHexComponent(this.r)}${this.toHexComponent(this.g)}${this.toHexComponent(this.b)}`;\n }\n\n public get packed(): number {\n return (\n (Math.round(this.r * 255) << 24) |\n (Math.round(this.g * 255) << 16) |\n (Math.round(this.b * 255) << 8) |\n Math.round(this.a * 255)\n );\n }\n\n public static from(colorLike: ColorLike): Color {\n if (colorLike instanceof Color) {\n return colorLike;\n }\n\n if (Array.isArray(colorLike)) {\n return new Color(colorLike[0], colorLike[1], colorLike[2], colorLike[3]);\n }\n\n throw new Error(\"Unsupported color format\");\n }\n\n public static fromRgbHex(hex: string): Color {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) {\n throw new Error(\"Invalid RGB hex, use form '#RRGGBB'\");\n }\n return new Color(\n parseInt(result[1], 16) / 255,\n parseInt(result[2], 16) / 255,\n parseInt(result[3], 16) / 255,\n 1.0\n );\n }\n\n private toHexComponent(value: number): string {\n const hex = Math.round(value * 255)\n .toString(16)\n .padStart(2, \"0\");\n return hex.length === 1 ? \"0\" + hex : hex;\n }\n}\n","import { Camera } from \"../objects/cameras/camera\";\nimport { Color, ColorLike } from \"./color\";\nimport { Layer } from \"./layer\";\nimport { Viewport } from \"./viewport\";\n\nexport abstract class Renderer {\n private readonly canvas_: HTMLCanvasElement | null;\n private width_ = 0;\n private height_ = 0;\n private backgroundColor_: Color = new Color(0, 0, 0, 0);\n\n protected renderedObjects_ = 0;\n protected abstract resize(width: number, height: number): void;\n protected abstract renderObject(\n layer: Layer,\n objectIndex: number,\n camera: Camera\n ): void;\n protected abstract clear(): void;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas_ = canvas;\n this.updateRendererSize();\n }\n\n public abstract render(viewport: Viewport): void;\n\n public updateSize(): void {\n this.updateRendererSize();\n this.resize(this.width_, this.height_);\n }\n\n private updateRendererSize() {\n this.width_ = this.canvas.clientWidth * window.devicePixelRatio;\n this.height_ = this.canvas.clientHeight * window.devicePixelRatio;\n\n if (this.canvas.width !== this.width_) this.canvas.width = this.width_;\n if (this.canvas.height !== this.height_) this.canvas.height = this.height_;\n }\n\n protected get canvas() {\n return this.canvas_!;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public get backgroundColor(): Color {\n return this.backgroundColor_;\n }\n\n public get renderedObjects() {\n return this.renderedObjects_;\n }\n\n public set backgroundColor(color: ColorLike) {\n this.backgroundColor_ = Color.from(color);\n }\n}\n","#version 300 es\n\nconst float PI = 3.14159265;\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 3) in vec3 inPrevPosition;\nlayout (location = 4) in vec3 inNextPosition;\nlayout (location = 5) in float direction;\nlayout (location = 6) in float path_proportion;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\nuniform vec2 Resolution;\nuniform float LineWidth;\nuniform float TaperOffset;\nuniform float TaperPower;\n\n// adapted from https://github.com/mattdesl/webgl-lines\nvoid main() {\n mat4 projModelView = Projection * ModelView;\n\n vec4 prevPos = projModelView * vec4(inPrevPosition, 1.0);\n vec4 currPos = projModelView * vec4(inPosition, 1.0);\n vec4 nextPos = projModelView * vec4(inNextPosition, 1.0);\n\n vec2 aspectVec = vec2(Resolution.x / Resolution.y, 1.0);\n vec2 prevScreen = (prevPos.xy / prevPos.w) * aspectVec;\n vec2 currScreen = (currPos.xy / currPos.w) * aspectVec;\n vec2 nextScreen = (nextPos.xy / nextPos.w) * aspectVec;\n\n vec2 diff;\n if (prevPos == currPos) {\n // first point on the path\n diff = nextScreen - currScreen;\n } else if (nextPos == currPos) {\n // last point on the path\n diff = currScreen - prevScreen;\n } else {\n // middle point on the path\n // combine the two directions to get a cheap miter\n // this is not a true miter join, but it also doesn't explode\n vec2 prevDiff = currScreen - prevScreen;\n vec2 nextDiff = nextScreen - currScreen;\n diff = normalize(prevDiff) + normalize(nextDiff);\n }\n\n // direction is + or -; which way to project the vertex away from the path\n // path_proportion is the distance along the path, from 0 to 1\n float d = sign(direction);\n float taper = 1.0;\n if (TaperPower > 0.0) {\n // glsl `pow(x, y)` is undefined if x < 0 or x = 0 and y <= 0\n float t = clamp(path_proportion - TaperOffset, -0.5, 0.5);\n float angle = PI * t;\n taper = pow(cos(angle), TaperPower);\n }\n vec2 normal = normalize(vec2(-diff.y, diff.x));\n\n vec4 offset = vec4(\n normal * d * taper * LineWidth / 2.0 / aspectVec,\n 0.0,\n 0.0\n );\n gl_Position = currPos + offset * currPos.w;\n\n // draw as GL_POINTS for debugging\n gl_PointSize = 5.0;\n}\n","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform vec3 LineColor;\n\nvoid main() {\n fragColor = vec4(LineColor, 1.0);\n}\n","#version 300 es\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 1) in vec3 inNormal;\nlayout (location = 2) in vec2 inUV;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nout vec2 TexCoords;\n\nvoid main() {\n TexCoords = inUV;\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n}","#version 300 es\n#pragma inject_defines\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\n#if defined TEXTURE_DATA_TYPE_INT\nuniform mediump isampler2D ImageSampler;\n#elif defined TEXTURE_DATA_TYPE_UINT\nuniform mediump usampler2D ImageSampler;\n#else\nuniform mediump sampler2D ImageSampler;\n#endif\n\nuniform vec3 Color;\nuniform float ValueOffset;\nuniform float ValueScale;\nuniform float u_opacity;\n\nin vec2 TexCoords;\n\nvoid main() {\n float texel = float(texture(ImageSampler, TexCoords).r);\n float value = (texel + ValueOffset) * ValueScale;\n fragColor = vec4(value * Color, u_opacity);\n}","#version 300 es\n#pragma inject_defines\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\n#if defined TEXTURE_DATA_TYPE_INT\nuniform mediump isampler2DArray ImageSampler;\n#elif defined TEXTURE_DATA_TYPE_UINT\nuniform mediump usampler2DArray ImageSampler;\n#else\nuniform mediump sampler2DArray ImageSampler;\n#endif\n// Define a maximum number of channels\n#define MAX_CHANNELS 32\nuniform bool Visible[MAX_CHANNELS];\nuniform vec3 Color[MAX_CHANNELS];\nuniform float ValueOffset[MAX_CHANNELS];\nuniform float ValueScale[MAX_CHANNELS];\nuniform float u_opacity;\n\nin vec2 TexCoords;\n\nvoid main() {\n vec3 rgbColor = vec3(0, 0, 0);\n for (int i = 0; i < MAX_CHANNELS; i++) {\n if (!Visible[i]) continue;\n float texel = float(texture(ImageSampler, vec3(TexCoords, i)).r);\n float value = (texel + ValueOffset[i]) * ValueScale[i];\n // clamp to [0, 1] because contrast limits may put values out of this range,\n // which distorts colors in other channels\n value = clamp(value, 0.0, 1.0);\n rgbColor += value * Color[i];\n }\n fragColor = vec4(rgbColor, u_opacity);\n}\n","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 7) in vec4 inColor;\nlayout (location = 8) in float inSize;\nlayout (location = 9) in float inMarker;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nout vec4 color;\nflat out uint marker;\n\n\nvoid main() {\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n gl_PointSize = inSize;\n color = inColor;\n marker = uint(inMarker);\n}\n\n","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform mediump sampler2DArray markerAtlas;\n\nin vec4 color;\nflat in uint marker;\n\nuniform float u_opacity;\n\n\nvoid main() {\n float alpha = texture(markerAtlas, vec3(gl_PointCoord, marker)).r;\n float alpha_threshold = 1e-2;\n if (alpha < alpha_threshold) {\n discard;\n }\n fragColor = vec4(color.rgb, u_opacity * alpha * color.a);\n}\n\n","#version 300 es\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 1) in vec3 inNormal;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nvoid main() {\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n}","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform float u_opacity;\nuniform vec3 u_color;\n\nvoid main() {\n fragColor = vec4(u_color, u_opacity);\n}","#version 300 es\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 2) in vec2 inUV;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nout vec2 TexCoords;\n\nvoid main() {\n TexCoords = inUV;\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n}\n","#version 300 es\n#pragma inject_defines\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\n#if defined TEXTURE_DATA_TYPE_INT\nuniform mediump isampler3D ImageSampler;\n#elif defined TEXTURE_DATA_TYPE_UINT\nuniform mediump usampler3D ImageSampler;\n#else\nuniform mediump sampler3D ImageSampler;\n#endif\n\nin vec2 TexCoords;\n\nvoid main() {\n float alpha = 0.0;\n /* Will replace fixed steps and normalization with uniforms later */\n for (int i = 0; i < 256; i++) {\n float z = float(i) / 255.0;\n float texel = float(texture(ImageSampler, vec3(TexCoords, z)).r);\n float newAlpha = clamp(texel / 1000.0, 0.0, 1.0);\n alpha = (1.0 - alpha) * newAlpha + alpha;\n }\n float displayValue = alpha;\n fragColor = vec4(displayValue, displayValue, displayValue, 1.0);\n}\n","#version 300 es\n\nprecision mediump float;\nprecision highp int;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform highp usampler2D ImageSampler;\nuniform mediump sampler2D ColorCycleSampler;\nuniform highp usampler2D ColorLookupTableSampler;\n\nuniform float u_opacity;\nuniform float u_outlineSelected; // Note: Using float instead of bool due to framework uniform handling\nuniform float u_selectedValue;\n\nin vec2 TexCoords;\n\nvec4 unpackRgba(uint packed) {\n uint r = (packed >> 24u) & 0xFFu;\n uint g = (packed >> 16u) & 0xFFu;\n uint b = (packed >> 8u) & 0xFFu;\n uint a = packed & 0xFFu;\n return vec4(float(r), float(g), float(b), float(a)) / 255.0;\n}\n\nbool isEdgePixel(uint centerValue) {\n vec2 texSize = vec2(textureSize(ImageSampler, 0));\n vec2 texelSize = 1.0 / texSize;\n \n // Check 8-connected neighbors\n for (int dx = -1; dx <= 1; dx++) {\n for (int dy = -1; dy <= 1; dy++) {\n if (dx == 0 && dy == 0) continue; // Skip center pixel\n \n vec2 neighborCoords = TexCoords + vec2(float(dx), float(dy)) * texelSize;\n \n // Skip if out of bounds\n if (neighborCoords.x < 0.0 || neighborCoords.x > 1.0 || \n neighborCoords.y < 0.0 || neighborCoords.y > 1.0) {\n continue;\n }\n \n uint neighborValue = texture(ImageSampler, neighborCoords).r;\n if (neighborValue != centerValue) {\n return true;\n }\n }\n }\n return false;\n}\n\nvoid main() {\n uint texel = texture(ImageSampler, TexCoords).r;\n \n // Check if this pixel is the selected value\n bool isSelectedValue = u_outlineSelected > 0.5 && u_selectedValue >= 0.0 && float(texel) == u_selectedValue;\n \n // Check if we should outline this selected segment\n if (isSelectedValue) {\n if (isEdgePixel(texel)) {\n // Draw outline in bright white with layer opacity\n fragColor = vec4(1.0, 1.0, 1.0, u_opacity);\n return;\n }\n }\n\n uint mapLength = uint(textureSize(ColorLookupTableSampler, 0).x);\n for (uint i = 0u; i < mapLength; ++i) {\n uint key = texelFetch(ColorLookupTableSampler, ivec2(i, 0), 0).r;\n if (texel == key) {\n uint value = texelFetch(ColorLookupTableSampler, ivec2(i, 1), 0).r;\n vec4 color = unpackRgba(value);\n \n // If this is the selected segment and outlining is enabled, make it slightly transparent\n float alpha = isSelectedValue ? u_opacity * color.a * 0.9 : u_opacity * color.a;\n \n fragColor = vec4(color.rgb, alpha);\n return;\n }\n }\n\n uint cycleLength = uint(textureSize(ColorCycleSampler, 0).x);\n uint index = uint(texel - 1u) % cycleLength;\n vec4 color = texelFetch(ColorCycleSampler, ivec2(index, 0), 0);\n \n // If this is the selected segment and outlining is enabled, make it slightly transparent\n float alpha = isSelectedValue ? u_opacity * color.a * 0.9 : u_opacity * color.a;\n \n fragColor = vec4(color.rgb, alpha);\n}","import projectedLineVertexShader from \"./projected_line_vert.glsl\";\nimport projectedLineFragmentShader from \"./projected_line_frag.glsl\";\nimport meshVertexShader from \"./mesh_vert.glsl\";\nimport scalarImageFragmentShader from \"./scalar_image_frag.glsl\";\nimport scalarImageArrayFragmentShader from \"./scalar_image_array_frag.glsl\";\nimport pointsVertexShader from \"./points_vert.glsl\";\nimport pointsFragmentShader from \"./points_frag.glsl\";\nimport wireframeVertexShader from \"./wireframe_vert.glsl\";\nimport wireframeFragmentShader from \"./wireframe_frag.glsl\";\nimport volumeVertexShader from \"./volume_vert.glsl\";\nimport volumeFragmentShader from \"./volume_frag.glsl\";\nimport labelImage from \"./label_image_frag.glsl\";\n\nexport type Shader =\n | \"floatScalarImage\"\n | \"floatScalarImageArray\"\n | \"floatVolume\"\n | \"intScalarImage\"\n | \"intScalarImageArray\"\n | \"intVolume\"\n | \"labelImage\"\n | \"points\"\n | \"projectedLine\"\n | \"uintScalarImage\"\n | \"uintScalarImageArray\"\n | \"uintVolume\"\n | \"wireframe\";\n\ntype ShaderCode = {\n vertex: string;\n vertexDefines?: ReadonlyMap<string, string>;\n fragment: string;\n fragmentDefines?: ReadonlyMap<string, string>;\n};\n\nexport const shaderCode: Record<Shader, ShaderCode> = {\n projectedLine: {\n vertex: projectedLineVertexShader,\n fragment: projectedLineFragmentShader,\n },\n points: {\n vertex: pointsVertexShader,\n fragment: pointsFragmentShader,\n },\n wireframe: {\n vertex: wireframeVertexShader,\n fragment: wireframeFragmentShader,\n },\n floatScalarImage: {\n vertex: meshVertexShader,\n fragment: scalarImageFragmentShader,\n },\n floatScalarImageArray: {\n vertex: meshVertexShader,\n fragment: scalarImageArrayFragmentShader,\n },\n intScalarImage: {\n vertex: meshVertexShader,\n fragment: scalarImageFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_INT\", \"1\"]]),\n },\n intScalarImageArray: {\n vertex: meshVertexShader,\n fragment: scalarImageArrayFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_INT\", \"1\"]]),\n },\n uintScalarImage: {\n vertex: meshVertexShader,\n fragment: scalarImageFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_UINT\", \"1\"]]),\n },\n uintScalarImageArray: {\n vertex: meshVertexShader,\n fragment: scalarImageArrayFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_UINT\", \"1\"]]),\n },\n labelImage: {\n vertex: meshVertexShader,\n fragment: labelImage,\n },\n floatVolume: {\n vertex: volumeVertexShader,\n fragment: volumeFragmentShader,\n },\n intVolume: {\n vertex: volumeVertexShader,\n fragment: volumeFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_INT\", \"1\"]]),\n },\n uintVolume: {\n vertex: volumeVertexShader,\n fragment: volumeFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_UINT\", \"1\"]]),\n },\n};\n","type LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\";\n\nconst Levels = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n} satisfies Record<LogLevel, number>;\n\nconst Colors = {\n debug: \"\\x1b[90m\", // gray\n info: \"\\x1b[36m\", // cyan\n warn: \"\\x1b[33m\", // yellow\n error: \"\\x1b[31m\", // red\n} satisfies Record<LogLevel, string>;\n\n// Add new module names here as needed to represent different parts of the application\ntype Module =\n | \"Channel\"\n | \"Chunk\"\n | \"ChunkManager\"\n | \"ChunkManagerSource\"\n | \"ChunkQueue\"\n | \"ChunkStore\"\n | \"ChunkStoreView\"\n | \"ChunkedImageLayer\"\n | \"EventDispatcher\"\n | \"Idetik\"\n | \"ImageLayer\"\n | \"ImageSeriesLoader\"\n | \"LabelImageLayer\"\n | \"Layer\"\n | \"PixelSizeObserver\"\n | \"RenderablePool\"\n | \"Viewport\"\n | \"VolumeLayer\"\n | \"WebGLRenderer\"\n | \"WebGLShaderProgram\"\n | \"WebGLTexture\"\n | \"WireframeGeometry\"\n | \"ZarrWorker\";\n\nexport function getMode(): \"production\" | \"development\" | \"test\" {\n const nodeEnv =\n typeof process !== \"undefined\" && typeof process.env?.NODE_ENV === \"string\"\n ? process.env.NODE_ENV\n : undefined;\n\n if (\n nodeEnv === \"production\" ||\n nodeEnv === \"development\" ||\n nodeEnv === \"test\"\n ) {\n return nodeEnv;\n }\n\n if (typeof window !== \"undefined\") {\n const { NODE_ENV } = window as { NODE_ENV?: unknown };\n\n if (\n NODE_ENV === \"production\" ||\n NODE_ENV === \"development\" ||\n NODE_ENV === \"test\"\n ) {\n return NODE_ENV;\n }\n }\n\n return \"development\";\n}\nexport class Logger {\n private static logLevel_: LogLevel =\n getMode() === \"production\" ? \"warn\" : \"debug\";\n\n public static setLogLevel(level: LogLevel) {\n Logger.logLevel_ = level;\n }\n\n public static debug(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"debug\", moduleName, message, ...params);\n }\n\n public static info(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"info\", moduleName, message, ...params);\n }\n\n public static warn(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"warn\", moduleName, message, ...params);\n }\n\n public static error(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"error\", moduleName, message, ...params);\n }\n\n private static log(\n level: LogLevel,\n moduleName: Module,\n message: string,\n ...args: unknown[]\n ) {\n if (Levels[level] < Levels[Logger.logLevel_]) return;\n\n const timestamp = new Date().toISOString();\n const color = Colors[level];\n const tag = `[${timestamp}][${level.toUpperCase()}][${moduleName}]`;\n const output = [`${color}${tag}`, message, ...args];\n\n switch (level) {\n case \"debug\":\n console.debug(...output); // eslint-disable-line no-console\n break;\n case \"info\":\n console.info(...output); // eslint-disable-line no-console\n break;\n case \"warn\":\n console.warn(...output); // eslint-disable-line no-console\n break;\n case \"error\":\n console.error(...output); // eslint-disable-line no-console\n break;\n }\n }\n}\n","import { Logger } from \"../utilities/logger\";\nimport { mat4, vec2, vec3 } from \"gl-matrix\";\n\nexport class WebGLShaderProgram {\n private readonly gl_: WebGL2RenderingContext;\n private readonly program_: WebGLProgram;\n private readonly uniformInfo_: Map<\n string,\n [WebGLUniformLocation, WebGLActiveInfo]\n > = new Map();\n\n constructor(\n gl: WebGL2RenderingContext,\n vertexShaderSource: string,\n fragmentShaderSource: string\n ) {\n this.gl_ = gl;\n\n const program = gl.createProgram();\n if (!program) {\n throw new Error(`Failed to create WebGL shader program`);\n }\n this.program_ = program;\n\n const shaders = [];\n try {\n shaders.push(this.addShader(vertexShaderSource, gl.VERTEX_SHADER));\n shaders.push(this.addShader(fragmentShaderSource, gl.FRAGMENT_SHADER));\n this.link();\n this.preprocessUniformLocations();\n } catch (error) {\n gl.deleteProgram(program);\n throw error;\n } finally {\n shaders.forEach((shader) => this.gl_.deleteShader(shader));\n }\n }\n\n public setUniform(name: string, value: unknown) {\n const [location, info] = this.uniformInfo_.get(name) ?? [];\n if (!location || !info) {\n throw new Error(`Uniform \"${name}\" not found in shader program`);\n }\n const type = info.type as SupportedUniformType;\n switch (type) {\n // There is no dedicated uniform1b in WebGL, but passing through\n // as a float or signed integer works, so fallthrough to float\n // for simplicity.\n case this.gl_.BOOL:\n case this.gl_.FLOAT:\n if (typeof value === \"number\") {\n this.gl_.uniform1f(location, value);\n } else {\n this.gl_.uniform1fv(location, value as Iterable<number>);\n }\n break;\n case this.gl_.FLOAT_VEC2:\n this.gl_.uniform2fv(location, value as vec2);\n break;\n case this.gl_.FLOAT_VEC3:\n this.gl_.uniform3fv(location, value as vec3);\n break;\n case this.gl_.FLOAT_MAT4:\n this.gl_.uniformMatrix4fv(location, false, value as mat4);\n break;\n // For samplers, the value is the texture index.\n case this.gl_.SAMPLER_2D:\n case this.gl_.SAMPLER_CUBE:\n case this.gl_.SAMPLER_3D:\n case this.gl_.SAMPLER_2D_ARRAY:\n case this.gl_.SAMPLER_2D_SHADOW:\n case this.gl_.SAMPLER_CUBE_SHADOW:\n case this.gl_.SAMPLER_2D_ARRAY_SHADOW:\n case this.gl_.INT_SAMPLER_2D:\n case this.gl_.INT_SAMPLER_3D:\n case this.gl_.INT_SAMPLER_CUBE:\n case this.gl_.INT_SAMPLER_2D_ARRAY:\n case this.gl_.UNSIGNED_INT_SAMPLER_2D:\n case this.gl_.UNSIGNED_INT_SAMPLER_3D:\n case this.gl_.UNSIGNED_INT_SAMPLER_CUBE:\n case this.gl_.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n this.gl_.uniform1i(location, value as number);\n break;\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unhandled uniform type: ${exhaustiveCheck}`);\n }\n }\n }\n\n private preprocessUniformLocations() {\n const numUniforms = this.gl_.getProgramParameter(\n this.program_,\n this.gl_.ACTIVE_UNIFORMS\n );\n for (let i = 0; i < numUniforms; i++) {\n const info = this.gl_.getActiveUniform(this.program_, i);\n if (info) {\n if (!SUPPORTED_UNIFORM_TYPES.has(info.type)) {\n throw new Error(\n `Unsupported uniform type \"${info.type}\" (GLenum) found in shader program for uniform \"${info.name}\"`\n );\n }\n\n const location = this.gl_.getUniformLocation(this.program_, info.name);\n if (location) {\n this.uniformInfo_.set(info.name, [location, info]);\n Logger.debug(\n \"WebGLShaderProgram\",\n \"Uniform found:\",\n info.name,\n info.type,\n info.size\n );\n }\n }\n }\n }\n\n private addShader(source: string, type: number) {\n const shader = this.gl_.createShader(type);\n if (!shader) {\n throw new Error(`Failed to create a new shader of type ${type}`);\n }\n\n this.gl_.shaderSource(shader, source);\n this.gl_.compileShader(shader);\n if (!this.gl_.getShaderParameter(shader, this.gl_.COMPILE_STATUS)) {\n const message = this.gl_.getShaderInfoLog(shader);\n this.gl_.deleteShader(shader);\n throw new Error(`Error compiling shader: ${message}`);\n }\n\n this.gl_.attachShader(this.program_, shader);\n return shader;\n }\n\n private link() {\n this.gl_.linkProgram(this.program_);\n if (!this.getParameter(this.gl_.LINK_STATUS)) {\n const message = this.gl_.getProgramInfoLog(this.program_);\n throw new Error(`Error linking program: ${message}`);\n }\n }\n\n public use() {\n this.gl_.useProgram(this.program_);\n }\n\n private getParameter(parameter: number) {\n return this.gl_.getProgramParameter(this.program_, parameter);\n }\n\n public get uniformNames(): string[] {\n return Array.from(this.uniformInfo_.keys());\n }\n}\n\n// using an array and converting to a set allows us to also create a type here\nconst SUPPORTED_UNIFORM_TYPES_ =\n typeof window !== \"undefined\" // Don't error in SSR contexts.\n ? [\n WebGL2RenderingContext.BOOL,\n WebGL2RenderingContext.FLOAT,\n WebGL2RenderingContext.FLOAT_VEC2,\n WebGL2RenderingContext.FLOAT_VEC3,\n WebGL2RenderingContext.FLOAT_MAT4,\n WebGL2RenderingContext.SAMPLER_2D,\n WebGL2RenderingContext.SAMPLER_CUBE,\n WebGL2RenderingContext.SAMPLER_3D,\n WebGL2RenderingContext.SAMPLER_2D_ARRAY,\n WebGL2RenderingContext.SAMPLER_2D_SHADOW,\n WebGL2RenderingContext.SAMPLER_CUBE_SHADOW,\n WebGL2RenderingContext.SAMPLER_2D_ARRAY_SHADOW,\n WebGL2RenderingContext.INT_SAMPLER_2D,\n WebGL2RenderingContext.INT_SAMPLER_3D,\n WebGL2RenderingContext.INT_SAMPLER_CUBE,\n WebGL2RenderingContext.INT_SAMPLER_2D_ARRAY,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_2D,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_3D,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_CUBE,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_2D_ARRAY,\n ]\n : [];\ntype SupportedUniformType = (typeof SUPPORTED_UNIFORM_TYPES_)[GLenum];\nconst SUPPORTED_UNIFORM_TYPES: ReadonlySet<GLenum> = new Set<GLenum>(\n SUPPORTED_UNIFORM_TYPES_\n);\n","import { Shader, shaderCode } from \"./shaders\";\nimport { WebGLShaderProgram } from \"./webgl_shader_program\";\n\nconst pragmaInjectDefines = \"#pragma inject_defines\";\n\nexport class WebGLShaderPrograms {\n private gl_: WebGL2RenderingContext;\n private programs_: Map<Shader, WebGLShaderProgram> = new Map();\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n }\n\n public use(shader: Shader): WebGLShaderProgram {\n let program = this.programs_.get(shader);\n if (program === undefined) {\n const code = shaderCode[shader];\n const vertexShaderSource = replaceSourceDefines(\n code.vertex,\n code.vertexDefines\n );\n const fragmentShaderSource = replaceSourceDefines(\n code.fragment,\n code.fragmentDefines\n );\n program = new WebGLShaderProgram(\n this.gl_,\n vertexShaderSource,\n fragmentShaderSource\n );\n program.use();\n const error = this.gl_.getError();\n if (error !== this.gl_.NO_ERROR) {\n throw new Error(`Error using WebGL program: ${error}`);\n }\n this.programs_.set(shader, program);\n } else {\n program.use();\n }\n return program;\n }\n}\n\nfunction replaceSourceDefines(\n source: string,\n defines?: ReadonlyMap<string, string>\n): string {\n if (defines === undefined || defines.size == 0) return source;\n if (!source.includes(pragmaInjectDefines)) {\n throw new Error(\n `Shader source does not contain \"${pragmaInjectDefines}\" directive`\n );\n }\n const definesSource = Array(defines.entries())\n .map(([key, value]) => `#define ${key} ${value}`)\n .join(\"\\n\");\n // Offset the line number so that the original source file line\n // numbers are interpretable. The +1 accounts for the #pragma directive\n // to be replaced.\n const lineNumberOffset = 1 - defines.size;\n const nextLineNumber = `#line __LINE__ + ${lineNumberOffset}`;\n const sourceToInject = `${definesSource}\\n${nextLineNumber}`;\n return source.replace(pragmaInjectDefines, sourceToInject);\n}\n","// prettier-ignore\nconst lut = [\n '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b',\n '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17',\n '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23',\n '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f',\n '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b',\n '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47',\n '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53',\n '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f',\n '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b',\n '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77',\n '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83',\n '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f',\n '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b',\n '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7',\n 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3',\n 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf',\n 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb',\n 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7',\n 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3',\n 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef',\n 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb',\n 'fc', 'fd', 'fe', 'ff'\n];\n\n// prettier-ignore\nexport function generateUUID() {\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n const uuid =\n lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] +\n lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +\n lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' +\n lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +\n lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' +\n lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +\n lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];\n // .toLowerCase() flattens concatenated strings to save heap memory space.\n return uuid.toLowerCase();\n}\n","import { generateUUID } from \"../utilities/uuid_generator\";\n\nexport abstract class Node {\n public readonly uuid = generateUUID();\n\n public abstract get type(): string;\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var 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 x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var 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 s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n 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 out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n 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]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();","import { mat4, vec3 } from \"gl-matrix\";\n\nexport class Box3 {\n public min: vec3;\n public max: vec3;\n\n /**\n * Initializes as an empty box if no values are provided using the\n * \"empty-by-sentinel\" pattern: min = +Infinity, max = -Infinity.\n * This allows expansion functions to work without special-casing\n * the first element, and avoids biasing toward (0,0,0).\n */\n constructor(min?: vec3, max?: vec3) {\n this.min = min\n ? vec3.clone(min)\n : vec3.fromValues(+Infinity, +Infinity, +Infinity);\n this.max = max\n ? vec3.clone(max)\n : vec3.fromValues(-Infinity, -Infinity, -Infinity);\n }\n\n public clone() {\n return new Box3(this.min, this.max);\n }\n\n public isEmpty(): boolean {\n return (\n this.max[0] <= this.min[0] ||\n this.max[1] <= this.min[1] ||\n this.max[2] <= this.min[2]\n );\n }\n\n // Half-open interval intersection: returns true only if boxes overlap.\n public static intersects(a: Box3, b: Box3): boolean {\n if (a.max[0] <= b.min[0] || a.min[0] >= b.max[0]) return false;\n if (a.max[1] <= b.min[1] || a.min[1] >= b.max[1]) return false;\n if (a.max[2] <= b.min[2] || a.min[2] >= b.max[2]) return false;\n return true;\n }\n\n public expandWithPoint(p: vec3) {\n if (p[0] < this.min[0]) this.min[0] = p[0];\n if (p[1] < this.min[1]) this.min[1] = p[1];\n if (p[2] < this.min[2]) this.min[2] = p[2];\n if (p[0] > this.max[0]) this.max[0] = p[0];\n if (p[1] > this.max[1]) this.max[1] = p[1];\n if (p[2] > this.max[2]) this.max[2] = p[2];\n }\n\n public applyTransform(matrix: mat4) {\n const { min, max } = this;\n const corners: vec3[] = [\n vec3.fromValues(min[0], min[1], min[2]),\n vec3.fromValues(min[0], min[1], max[2]),\n vec3.fromValues(min[0], max[1], min[2]),\n vec3.fromValues(min[0], max[1], max[2]),\n vec3.fromValues(max[0], min[1], min[2]),\n vec3.fromValues(max[0], min[1], max[2]),\n vec3.fromValues(max[0], max[1], min[2]),\n vec3.fromValues(max[0], max[1], max[2]),\n ];\n\n // \"Empty\" box before expanding\n this.min = vec3.fromValues(+Infinity, +Infinity, +Infinity);\n this.max = vec3.fromValues(-Infinity, -Infinity, -Infinity);\n\n const tmp = vec3.create();\n for (const c of corners) {\n vec3.transformMat4(tmp, c, matrix);\n this.expandWithPoint(tmp);\n }\n }\n}\n","import { Node } from \"./node\";\nimport { Box3 } from \"../math/box3\";\nimport { vec3 } from \"gl-matrix\";\n\nexport type Primitive = \"triangles\" | \"points\" | \"lines\";\n\ntype GeometryAttributeType =\n | \"position\"\n | \"normal\"\n | \"uv\"\n | \"next_position\"\n | \"previous_position\"\n | \"direction\"\n | \"path_proportion\"\n | \"color\"\n | \"size\"\n | \"marker\";\n\nexport const GeometryAttributeIndex: Record<GeometryAttributeType, number> = {\n position: 0,\n normal: 1,\n uv: 2,\n next_position: 3,\n previous_position: 4,\n direction: 5,\n path_proportion: 6,\n color: 7,\n size: 8,\n marker: 9,\n};\n\ntype GeometryAttribute = {\n type: GeometryAttributeType;\n itemSize: number;\n offset: number;\n};\n\nexport class Geometry extends Node {\n private boundingBox_: Box3 | null = null;\n protected primitive_: Primitive;\n protected attributes_: GeometryAttribute[];\n protected vertexData_: Float32Array;\n protected indexData_: Uint32Array;\n\n constructor(\n vertexData: number[] = [],\n indexData: number[] = [],\n primitive: Primitive = \"triangles\"\n ) {\n super();\n this.vertexData_ = new Float32Array(vertexData);\n this.indexData_ = new Uint32Array(indexData);\n this.primitive_ = primitive;\n this.attributes_ = [];\n }\n\n public addAttribute(attr: GeometryAttribute) {\n this.attributes_.push(attr);\n this.boundingBox_ = null;\n }\n\n public get vertexCount() {\n return this.vertexData_.byteLength / this.strideBytes;\n }\n\n public get stride() {\n return this.attributes_.reduce((acc, curr) => {\n return acc + curr.itemSize;\n }, 0);\n }\n\n public get strideBytes() {\n return this.stride * Float32Array.BYTES_PER_ELEMENT;\n }\n\n public get primitive() {\n return this.primitive_;\n }\n\n public get vertexData() {\n return this.vertexData_;\n }\n\n public get indexData() {\n return this.indexData_;\n }\n\n public get attributes() {\n return this.attributes_;\n }\n\n public get boundingBox() {\n if (this.boundingBox_ === null) {\n const attr = this.getAttribute(\"position\");\n if (!attr || this.vertexCount === 0) {\n throw new Error(\"Failed to generate bounding box\");\n }\n\n const offset = (attr.offset ?? 0) / Float32Array.BYTES_PER_ELEMENT;\n const box = new Box3();\n const point = vec3.create();\n for (let i = 0; i < this.vertexData_.length; i += this.stride) {\n point[0] = this.vertexData_[i + offset + 0];\n point[1] = this.vertexData_[i + offset + 1];\n point[2] = this.vertexData_[i + offset + 2];\n box.expandWithPoint(point);\n }\n\n this.boundingBox_ = box;\n }\n return this.boundingBox_;\n }\n\n public get type() {\n return \"Geometry\";\n }\n\n private getAttribute(type: GeometryAttributeType) {\n return this.attributes_.find((a) => a.type === type);\n }\n}\n","import { Geometry, GeometryAttributeIndex } from \"../core/geometry\";\n\ntype BufferHandles = {\n vao: WebGLVertexArrayObject;\n vbo: WebGLBuffer;\n ebo?: WebGLBuffer;\n};\n\nexport class WebGLBuffers {\n private readonly gl_: WebGL2RenderingContext;\n private readonly buffers_: Map<Geometry, BufferHandles> = new Map();\n private currentGeometry_: Geometry | null = null;\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n }\n\n public bindGeometry(geometry: Geometry) {\n if (this.alreadyActive(geometry)) return;\n\n if (!this.buffers_.has(geometry)) {\n this.generateBuffers(geometry);\n }\n\n const buffers = this.buffers_.get(geometry);\n if (!buffers) {\n throw new Error(\"Failed to retrieve buffer handles for object\");\n }\n\n this.gl_.bindVertexArray(buffers.vao);\n this.currentGeometry_ = geometry;\n }\n\n public disposeObject(geometry: Geometry) {\n const buffers = this.buffers_.get(geometry);\n if (!buffers) return;\n\n this.gl_.deleteVertexArray(buffers.vao);\n this.gl_.deleteBuffer(buffers.vbo);\n\n if (buffers.ebo) this.gl_.deleteBuffer(buffers.ebo);\n\n this.buffers_.delete(geometry);\n if (this.currentGeometry_ === geometry) {\n this.currentGeometry_ = null;\n }\n }\n\n public disposeAll() {\n for (const geometry of this.buffers_.keys()) {\n this.disposeObject(geometry);\n }\n }\n\n private alreadyActive(geometry: Geometry) {\n return this.currentGeometry_ === geometry;\n }\n\n private generateBuffers(geometry: Geometry) {\n const vao = this.gl_.createVertexArray();\n if (!vao) {\n throw new Error(\"Failed to create vertex array object (VAO)\");\n }\n\n this.gl_.bindVertexArray(vao);\n\n const { vertexData } = geometry;\n const vboType = this.gl_.ARRAY_BUFFER;\n const vbo = this.gl_.createBuffer();\n if (!vbo) throw new Error(\"Failed to create vertex buffer (VBO)\");\n\n this.gl_.bindBuffer(vboType, vbo);\n this.gl_.bufferData(vboType, vertexData, this.gl_.STATIC_DRAW);\n\n const { attributes, strideBytes } = geometry;\n attributes.forEach((attr) => {\n const idx = GeometryAttributeIndex[attr.type];\n this.gl_.vertexAttribPointer(\n idx,\n attr.itemSize,\n this.gl_.FLOAT,\n false,\n strideBytes,\n attr.offset\n );\n this.gl_.enableVertexAttribArray(idx);\n });\n\n const buffers: BufferHandles = { vao, vbo };\n\n const { indexData } = geometry;\n if (indexData.length) {\n const eboType = this.gl_.ELEMENT_ARRAY_BUFFER;\n const ebo = this.gl_.createBuffer();\n if (!ebo) throw new Error(\"Failed to create index buffer (EBO)\");\n\n this.gl_.bindBuffer(eboType, ebo);\n this.gl_.bufferData(eboType, indexData, this.gl_.STATIC_DRAW);\n buffers.ebo = ebo;\n }\n\n this.buffers_.set(geometry, buffers);\n this.gl_.bindVertexArray(null);\n }\n}\n","import { Logger } from \"../utilities/logger\";\nimport {\n Texture,\n TextureFilter,\n TextureWrapMode,\n TextureDataType,\n TextureDataFormat,\n} from \"../objects/textures/texture\";\n\nimport { Texture2D } from \"../objects/textures/texture_2d\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { Texture3D } from \"../objects/textures/texture_3d\";\n\ntype TextureFormatInfo = {\n internalFormat: number;\n format: number;\n type: number;\n};\n\nexport class WebGLTextures {\n private readonly gl_: WebGL2RenderingContext;\n private readonly textures_: Map<Texture, WebGLTexture> = new Map();\n private currentTexture_: Texture | null = null;\n private readonly maxTextureUnits_: number;\n private gpuTextureBytes_ = 0;\n private textureCount_ = 0;\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n this.maxTextureUnits_ = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n }\n\n public bindTexture(texture: Texture, index: number) {\n if (this.alreadyActive(texture)) return;\n\n if (index < 0 || index >= this.maxTextureUnits_) {\n throw new Error(\n `Texture index ${index} must be in [0, ${this.maxTextureUnits_ - 1}]`\n );\n }\n this.gl_.activeTexture(this.gl_.TEXTURE0 + index);\n\n const textureType = this.getTextureType(texture);\n const info = this.getDataFormatInfo(texture.dataFormat, texture.dataType);\n\n if (!this.textures_.has(texture)) {\n this.generateTexture(texture, info, textureType);\n }\n\n const textureId = this.textures_.get(texture);\n if (!textureId) {\n throw new Error(\"Failed to retrieve texture ID\");\n }\n\n this.gl_.bindTexture(textureType, textureId);\n if (texture.needsUpdate && texture.data !== null) {\n this.configureTextureParameters(texture, textureType);\n this.uploadTextureData(texture, info, textureType);\n texture.needsUpdate = false;\n }\n\n this.currentTexture_ = texture;\n }\n\n public disposeTexture(texture: Texture) {\n const id = this.textures_.get(texture);\n if (id) {\n this.gl_.deleteTexture(id);\n this.textures_.delete(texture);\n if (this.currentTexture_ === texture) {\n this.currentTexture_ = null;\n }\n\n const info = this.getDataFormatInfo(texture.dataFormat, texture.dataType);\n const bytes = this.computeStorageBytes(texture, info);\n this.gpuTextureBytes_ = Math.max(0, this.gpuTextureBytes_ - bytes);\n this.textureCount_ = Math.max(0, this.textureCount_ - 1);\n }\n }\n\n public disposeAll() {\n for (const texture of Array.from(this.textures_.keys())) {\n this.disposeTexture(texture);\n }\n this.gpuTextureBytes_ = 0;\n this.textureCount_ = 0;\n }\n\n public get textureInfo() {\n return {\n textures: this.textureCount_,\n totalBytes: this.gpuTextureBytes_,\n };\n }\n\n private alreadyActive(texture: Texture) {\n return this.currentTexture_ === texture && !texture.needsUpdate;\n }\n\n private generateTexture(\n texture: Texture,\n info: TextureFormatInfo,\n type: number\n ) {\n const textureId = this.gl_.createTexture();\n if (!textureId) throw new Error(\"Failed to create texture\");\n\n this.gl_.bindTexture(type, textureId);\n\n if (this.isTexture2D(texture)) {\n this.gl_.texStorage2D(\n type,\n texture.mipmapLevels,\n info.internalFormat,\n texture.width,\n texture.height\n );\n } else if (this.isTextureStorage3D(texture)) {\n this.gl_.texStorage3D(\n type,\n texture.mipmapLevels,\n info.internalFormat,\n texture.width,\n texture.height,\n texture.depth\n );\n } else {\n throw new Error(`Unknown texture type ${texture.type}`);\n }\n\n this.gpuTextureBytes_ += this.computeStorageBytes(texture, info);\n this.textureCount_ += 1;\n this.textures_.set(texture, textureId);\n this.gl_.bindTexture(type, null);\n }\n\n private configureTextureParameters(texture: Texture, type: number) {\n const gl = this.gl_;\n const minFilter = this.getFilter(texture.minFilter, texture);\n const maxFilter = this.getFilter(texture.maxFilter, texture);\n\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, maxFilter);\n gl.texParameteri(type, gl.TEXTURE_WRAP_S, this.getWrapMode(texture.wrapS));\n gl.texParameteri(type, gl.TEXTURE_WRAP_T, this.getWrapMode(texture.wrapT));\n gl.texParameteri(type, gl.TEXTURE_WRAP_R, this.getWrapMode(texture.wrapR));\n }\n\n private uploadTextureData(\n texture: Texture,\n info: TextureFormatInfo,\n type: number\n ) {\n // Only base level (0) is updated; mipmaps are not supported.\n const mipmapLevel = 0;\n\n // Zero offsets because entire dataset is overwritten.\n const offset = { x: 0, y: 0, z: 0 };\n\n if (this.isTexture2D(texture)) {\n this.gl_.texSubImage2D(\n type,\n mipmapLevel,\n offset.x,\n offset.y,\n texture.width,\n texture.height,\n info.format,\n info.type,\n // This function has multiple overloads. We are temporarily casting it to\n // ArrayBufferView to ensure the correct overload is called. Once we\n // consolidate Texture2D and DataTexture2D, we can remove this cast.\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texSubImage2D#syntax\n texture.data as ArrayBufferView\n );\n } else if (this.isTextureStorage3D(texture)) {\n this.gl_.texSubImage3D(\n type,\n mipmapLevel,\n offset.x,\n offset.y,\n offset.z,\n texture.width,\n texture.height,\n texture.depth,\n info.format,\n info.type,\n texture.data as ArrayBufferView\n );\n } else {\n throw new Error(\n \"Attempting to upload data for an unsupported texture type\"\n );\n }\n }\n\n private getFilter(filter: TextureFilter, texture: Texture) {\n const { dataFormat, dataType } = texture;\n if (\n dataFormat === \"scalar\" &&\n dataType !== \"float\" &&\n filter !== \"nearest\"\n ) {\n Logger.warn(\n \"WebGLTexture\",\n \"Integer values are not filterable. Using gl.NEAREST instead.\"\n );\n return this.gl_.NEAREST;\n }\n // prettier-ignore\n switch (filter) {\n case \"nearest\": return this.gl_.NEAREST;\n case \"linear\": return this.gl_.LINEAR;\n default: throw new Error(`Unsupported texture filter: ${filter}`);\n }\n }\n\n private getTextureType(texture: Texture) {\n if (this.isTexture2D(texture)) return this.gl_.TEXTURE_2D;\n if (this.isTexture2DArray(texture)) return this.gl_.TEXTURE_2D_ARRAY;\n if (this.isTexture3D(texture)) return this.gl_.TEXTURE_3D;\n throw new Error(`Unknown texture type ${texture.type}`);\n }\n\n private getWrapMode(mode: TextureWrapMode) {\n // prettier-ignore\n switch (mode) {\n case \"repeat\": return this.gl_.REPEAT;\n case \"clamp_to_edge\": return this.gl_.CLAMP_TO_EDGE;\n default: throw new Error(`Unsupported wrap mode: ${mode}`);\n }\n }\n\n private getDataFormatInfo(\n format: TextureDataFormat,\n type: TextureDataType\n ): TextureFormatInfo {\n if (format === \"rgba\" && type === \"unsigned_byte\") {\n return {\n internalFormat: this.gl_.RGBA8,\n format: this.gl_.RGBA,\n type: this.gl_.UNSIGNED_BYTE,\n };\n }\n if (format === \"rgb\" && type === \"unsigned_byte\") {\n return {\n internalFormat: this.gl_.RGB8,\n format: this.gl_.RGB,\n type: this.gl_.UNSIGNED_BYTE,\n };\n }\n if (format === \"scalar\") {\n switch (type) {\n case \"byte\":\n return {\n internalFormat: this.gl_.R8I,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.BYTE,\n };\n case \"short\":\n return {\n internalFormat: this.gl_.R16I,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.SHORT,\n };\n case \"int\":\n return {\n internalFormat: this.gl_.R32I,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.INT,\n };\n case \"unsigned_byte\":\n return {\n internalFormat: this.gl_.R8UI,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.UNSIGNED_BYTE,\n };\n case \"unsigned_short\":\n return {\n internalFormat: this.gl_.R16UI,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.UNSIGNED_SHORT,\n };\n case \"unsigned_int\":\n return {\n internalFormat: this.gl_.R32UI,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.UNSIGNED_INT,\n };\n case \"float\":\n return {\n internalFormat: this.gl_.R32F,\n format: this.gl_.RED,\n type: this.gl_.FLOAT,\n };\n default:\n throw new Error(`Unsupported scalar type: ${type}`);\n }\n }\n throw new Error(`Unsupported format/type: ${format}/${type}`);\n }\n\n private computeStorageBytes(\n texture: Texture,\n info: TextureFormatInfo\n ): number {\n const bytes = this.bytesPerTexel(info);\n const levels = Math.max(1, texture.mipmapLevels);\n const depth = this.isTextureStorage3D(texture)\n ? Math.max(1, texture.depth)\n : 1;\n\n let width = Math.max(1, texture.width);\n let height = Math.max(1, texture.height);\n let total = 0;\n for (let level = 0; level < levels; level++) {\n total += width * height * depth * bytes;\n width = Math.max(1, width >> 1);\n height = Math.max(1, height >> 1);\n }\n\n return total;\n }\n\n private bytesPerTexel(info: TextureFormatInfo): number {\n const gl = this.gl_;\n if (info.format === gl.RGB && info.type === gl.UNSIGNED_BYTE) return 3;\n if (info.format === gl.RGBA && info.type === gl.UNSIGNED_BYTE) return 4;\n if (info.format === gl.RED_INTEGER) {\n switch (info.type) {\n case gl.BYTE:\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.SHORT:\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.INT:\n case gl.UNSIGNED_INT:\n return 4;\n }\n }\n if (info.format === gl.RED && info.type === gl.FLOAT) return 4;\n\n throw new Error(\"bytesPerTexel: unsupported format/type\");\n }\n\n private isTextureStorage3D(\n texture: Texture\n ): texture is Texture2DArray | Texture3D {\n return this.isTexture2DArray(texture) || this.isTexture3D(texture);\n }\n\n private isTexture2D(texture: Texture): texture is Texture2D {\n return texture.type === \"Texture2D\";\n }\n\n private isTexture2DArray(texture: Texture): texture is Texture2DArray {\n return texture.type === \"Texture2DArray\";\n }\n\n private isTexture3D(texture: Texture): texture is Texture3D {\n return texture.type === \"Texture3D\";\n }\n}\n","import { vec2 } from \"gl-matrix\";\n\nexport class Box2 {\n public min: vec2;\n public max: vec2;\n\n /**\n * Initializes as an empty box if no values are provided using the\n * \"empty-by-sentinel\" pattern: min = +Infinity, max = -Infinity.\n * This allows expansion functions to work without special-casing\n * the first element, and avoids biasing toward (0,0).\n */\n constructor(min?: vec2, max?: vec2) {\n this.min = min ? vec2.clone(min) : vec2.fromValues(+Infinity, +Infinity);\n this.max = max ? vec2.clone(max) : vec2.fromValues(-Infinity, -Infinity);\n }\n\n public clone() {\n return new Box2(this.min, this.max);\n }\n\n public isEmpty(): boolean {\n return this.max[0] <= this.min[0] || this.max[1] <= this.min[1];\n }\n\n // Half-open interval intersection: returns true only if boxes overlap.\n public static intersects(a: Box2, b: Box2): boolean {\n if (a.max[0] <= b.min[0] || a.min[0] >= b.max[0]) return false;\n if (a.max[1] <= b.min[1] || a.min[1] >= b.max[1]) return false;\n return true;\n }\n\n public static equals(a: Box2, b: Box2): boolean {\n return vec2.exactEquals(a.min, b.min) && vec2.exactEquals(a.max, b.max);\n }\n\n public floor(): Box2 {\n return new Box2(\n vec2.fromValues(Math.floor(this.min[0]), Math.floor(this.min[1])),\n vec2.fromValues(Math.floor(this.max[0]), Math.floor(this.max[1]))\n );\n }\n\n public toRect(): { x: number; y: number; width: number; height: number } {\n const x = this.min[0];\n const y = this.min[1];\n const width = this.max[0] - this.min[0];\n const height = this.max[1] - this.min[1];\n return { x, y, width, height };\n }\n}\n","import { Box2 } from \"../math/box2\";\n\nexport type BlendingMode =\n | \"none\"\n | \"normal\"\n | \"additive\"\n | \"multiply\"\n | \"subtractive\";\n\nexport type CullingMode = \"none\" | \"front\" | \"back\" | \"both\";\n\nexport class WebGLState {\n private readonly gl_: WebGL2RenderingContext;\n\n private enabledCapabilities_ = new Map<GLenum, boolean>();\n private depthMaskEnabled_: boolean | null = null;\n private blendSrcFactor_: GLenum | null = null;\n private blendDstFactor_: GLenum | null = null;\n private currentBlendingMode_: BlendingMode | null = null;\n private currentViewport_: Box2 | null = null;\n private currentScissor_: Box2 | null = null;\n private currentCullingMode_: CullingMode | null = null;\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n }\n\n private enable(cap: GLenum) {\n if (!this.enabledCapabilities_.get(cap)) {\n this.gl_.enable(cap);\n this.enabledCapabilities_.set(cap, true);\n }\n }\n\n private disable(cap: GLenum) {\n if (this.enabledCapabilities_.get(cap)) {\n this.gl_.disable(cap);\n this.enabledCapabilities_.set(cap, false);\n }\n }\n\n private setBlendFunc(src: GLenum, dst: GLenum) {\n if (this.blendSrcFactor_ !== src || this.blendDstFactor_ !== dst) {\n this.gl_.blendFunc(src, dst);\n this.blendSrcFactor_ = src;\n this.blendDstFactor_ = dst;\n }\n }\n\n public setDepthTesting(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.DEPTH_TEST);\n } else {\n this.disable(this.gl_.DEPTH_TEST);\n }\n }\n\n public setBlending(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.BLEND);\n } else {\n this.disable(this.gl_.BLEND);\n }\n }\n\n public setDepthMask(flag: boolean) {\n if (this.depthMaskEnabled_ !== flag) {\n this.gl_.depthMask(flag);\n this.depthMaskEnabled_ = flag;\n }\n }\n\n public setBlendingMode(mode: BlendingMode) {\n if (this.currentBlendingMode_ === mode) return;\n\n if (mode === \"none\") {\n this.setBlending(false);\n } else {\n this.setBlending(true);\n switch (mode) {\n case \"additive\":\n this.setBlendFunc(this.gl_.SRC_ALPHA, this.gl_.ONE);\n break;\n case \"multiply\":\n this.setBlendFunc(this.gl_.DST_COLOR, this.gl_.ZERO);\n break;\n case \"subtractive\":\n this.setBlendFunc(this.gl_.ZERO, this.gl_.ONE_MINUS_SRC_COLOR);\n break;\n case \"normal\":\n default:\n this.setBlendFunc(this.gl_.SRC_ALPHA, this.gl_.ONE_MINUS_SRC_ALPHA);\n break;\n }\n }\n this.currentBlendingMode_ = mode;\n }\n\n public setViewport(box: Box2) {\n const clampedBox = box.floor();\n\n if (\n this.currentViewport_ &&\n Box2.equals(clampedBox, this.currentViewport_)\n ) {\n return;\n }\n const { x, y, width, height } = clampedBox.toRect();\n this.gl_.viewport(x, y, width, height);\n this.currentViewport_ = clampedBox;\n }\n\n public setScissorTest(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.SCISSOR_TEST);\n } else {\n this.disable(this.gl_.SCISSOR_TEST);\n this.currentScissor_ = null;\n }\n }\n\n public setScissor(box: Box2) {\n const clampedBox = box.floor();\n\n if (this.currentScissor_ && Box2.equals(clampedBox, this.currentScissor_)) {\n return;\n }\n const { x, y, width, height } = clampedBox.toRect();\n this.gl_.scissor(x, y, width, height);\n this.currentScissor_ = clampedBox;\n }\n\n public setCullFace(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.CULL_FACE);\n } else {\n this.disable(this.gl_.CULL_FACE);\n }\n }\n\n public setCullFaceMode(mode: CullingMode) {\n if (this.currentCullingMode_ === mode) return;\n\n if (mode === \"none\") {\n this.setCullFace(false);\n } else {\n this.setCullFace(true);\n switch (mode) {\n case \"front\":\n this.gl_.cullFace(this.gl_.FRONT);\n break;\n case \"back\":\n this.gl_.cullFace(this.gl_.BACK);\n break;\n case \"both\":\n this.gl_.cullFace(this.gl_.FRONT_AND_BACK);\n break;\n }\n }\n\n this.currentCullingMode_ = mode;\n }\n}\n","import { Renderer } from \"../core/renderer\";\nimport { WebGLShaderProgram } from \"./webgl_shader_program\";\nimport { WebGLShaderPrograms } from \"./webgl_shader_programs\";\nimport { Logger } from \"../utilities/logger\";\n\nimport { WebGLBuffers } from \"./webgl_buffers\";\nimport { WebGLTextures } from \"./webgl_textures\";\n\nimport { Layer } from \"../core/layer\";\nimport { WebGLState } from \"./WebGLState\";\nimport { RenderableObject } from \"../core/renderable_object\";\nimport { Geometry, Primitive } from \"../core/geometry\";\nimport { Box2 } from \"../math/box2\";\nimport { Viewport } from \"../core/viewport\";\nimport { Camera } from \"../objects/cameras/camera\";\n\nimport { mat4, vec2 } from \"gl-matrix\";\nimport { Frustum } from \"../math/frustum\";\n\n// The library's coordinate system is left-handed.\n// With the default camera, the standard basis vectors should\n// look as follows.\n// (1, 0, 0) points to the right of the screen\n// (0, 1, 0) points to the bottom of the screen\n// (0, 0, 1) points out of the screen\n// WebGL's coordinate system is right-handed where the vectors\n// point in the same directions except that\n// (0, 1, 0) points to the top of the screen\n// Therefore, this transform makes the appropriate flip in y.\nconst axisDirection = mat4.fromScaling(mat4.create(), [1, -1, 1]);\n\nexport class WebGLRenderer extends Renderer {\n private readonly gl_: WebGL2RenderingContext | null = null;\n private readonly programs_: WebGLShaderPrograms;\n private readonly bindings_: WebGLBuffers;\n private readonly textures_: WebGLTextures;\n private readonly state_: WebGLState;\n private renderedObjectsPerFrame_ = 0;\n\n constructor(canvas: HTMLCanvasElement) {\n super(canvas);\n\n this.gl_ = this.canvas.getContext(\"webgl2\", {\n depth: true,\n antialias: true,\n });\n if (!this.gl_) {\n throw new Error(`Failed to initialize WebGL2 context`);\n }\n Logger.info(\n \"WebGLRenderer\",\n `WebGL version ${this.gl.getParameter(this.gl.VERSION)}`\n );\n\n this.programs_ = new WebGLShaderPrograms(this.gl);\n this.bindings_ = new WebGLBuffers(this.gl);\n this.textures_ = new WebGLTextures(this.gl);\n this.state_ = new WebGLState(this.gl);\n this.resize(this.canvas.width, this.canvas.height);\n }\n\n public render(viewport: Viewport) {\n const viewportBox = viewport.getBoxRelativeTo(this.canvas);\n const rendererBox = new Box2(\n vec2.fromValues(0, 0),\n vec2.fromValues(this.width, this.height)\n );\n if (Box2.equals(viewportBox.floor(), rendererBox.floor())) {\n this.state_.setScissorTest(false);\n } else if (Box2.intersects(viewportBox, rendererBox)) {\n this.state_.setScissor(viewportBox);\n this.state_.setScissorTest(true);\n } else {\n Logger.warn(\n \"WebGLRenderer\",\n `Viewport ${viewport.id} is entirely outside canvas bounds, skipping render`\n );\n return;\n }\n this.state_.setViewport(viewportBox);\n this.renderedObjectsPerFrame_ = 0;\n this.clear();\n\n const { opaque, transparent } = viewport.layerManager.partitionLayers();\n\n this.state_.setDepthMask(true);\n\n const frustum = viewport.camera.frustum;\n const renderContext = { viewport };\n\n for (const layer of opaque) {\n layer.update(renderContext);\n if (layer.state === \"ready\") {\n this.renderLayer(layer, viewport.camera, frustum);\n }\n }\n\n this.state_.setDepthMask(false);\n for (const layer of transparent) {\n layer.update(renderContext);\n if (layer.state !== \"ready\") continue;\n this.renderLayer(layer, viewport.camera, frustum);\n }\n this.state_.setDepthMask(true);\n\n this.renderedObjects_ = this.renderedObjectsPerFrame_;\n }\n\n public get textureInfo() {\n return this.textures_.textureInfo;\n }\n\n private renderLayer(layer: Layer, camera: Camera, frustum: Frustum) {\n this.state_.setBlendingMode(layer.transparent ? layer.blendMode : \"none\");\n\n layer.objects.forEach((object, i) => {\n if (frustum.intersectsWithBox3(object.boundingBox)) {\n this.renderObject(layer, i, camera);\n this.renderedObjectsPerFrame_ += 1;\n }\n });\n }\n\n protected renderObject(layer: Layer, objectIndex: number, camera: Camera) {\n const object = layer.objects[objectIndex];\n this.state_.setCullFaceMode(object.cullFaceMode);\n this.bindings_.bindGeometry(object.geometry);\n object.popStaleTextures().forEach((texture) => {\n this.textures_.disposeTexture(texture);\n });\n object.textures.forEach((texture, index) => {\n this.textures_.bindTexture(texture, index);\n });\n\n const program = this.programs_.use(object.programName);\n this.drawGeometry(object.geometry, object, layer, program, camera);\n\n if (object.wireframeEnabled) {\n this.bindings_.bindGeometry(object.wireframeGeometry);\n const wireframeProgram = this.programs_.use(\"wireframe\");\n wireframeProgram.setUniform(\"u_color\", object.wireframeColor.rgb);\n this.drawGeometry(\n object.wireframeGeometry,\n object,\n layer,\n wireframeProgram,\n camera\n );\n }\n }\n\n private drawGeometry(\n geometry: Geometry,\n object: RenderableObject,\n layer: Layer,\n program: WebGLShaderProgram,\n camera: Camera\n ) {\n const modelView = mat4.multiply(\n mat4.create(),\n camera.viewMatrix,\n object.transform.matrix\n );\n const projection = mat4.multiply(\n mat4.create(),\n axisDirection,\n camera.projectionMatrix\n );\n const resolution = [this.canvas.width, this.canvas.height];\n\n const objectUniforms = object.getUniforms();\n for (const uniformName of program.uniformNames) {\n switch (uniformName) {\n case \"ModelView\":\n program.setUniform(uniformName, modelView);\n break;\n case \"Projection\":\n program.setUniform(uniformName, projection);\n break;\n case \"Resolution\":\n program.setUniform(uniformName, resolution);\n break;\n case \"u_opacity\":\n program.setUniform(uniformName, layer.opacity);\n break;\n default:\n if (uniformName in objectUniforms) {\n program.setUniform(uniformName, objectUniforms[uniformName]);\n }\n }\n }\n\n const primitive = this.glGetPrimitive(geometry.primitive);\n const index = geometry.indexData;\n if (index.length) {\n this.gl.drawElements(primitive, index.length, this.gl.UNSIGNED_INT, 0);\n } else {\n this.gl.drawArrays(primitive, 0, geometry.vertexCount);\n }\n }\n\n private glGetPrimitive(type: Primitive) {\n switch (type) {\n case \"points\":\n return this.gl.POINTS;\n case \"triangles\":\n return this.gl.TRIANGLES;\n case \"lines\":\n return this.gl.LINES;\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unknown Primitive type: ${exhaustiveCheck}`);\n }\n }\n }\n\n protected resize(width: number, height: number) {\n const newViewport = new Box2(\n vec2.fromValues(0, 0),\n vec2.fromValues(width, height)\n );\n this.state_.setViewport(newViewport);\n }\n\n protected clear() {\n this.gl.clearColor(...this.backgroundColor.rgba);\n this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n this.state_.setDepthTesting(true);\n this.gl.depthFunc(this.gl.LEQUAL);\n }\n\n private get gl() {\n return this.gl_!;\n }\n}\n","import { Chunk } from \"./chunk\";\nimport { Logger } from \"../utilities/logger\";\n\nconst MAX_CONCURRENT = 8;\n\ntype LoaderFn = (signal: AbortSignal) => Promise<void>;\n\ntype PendingItem = { chunk: Chunk; fn: LoaderFn };\n\nexport class ChunkQueue {\n private readonly maxConcurrent_: number;\n private readonly pending_: PendingItem[] = [];\n private readonly running_ = new Map<\n Chunk,\n { controller: AbortController; promise: Promise<void> }\n >();\n\n constructor(maxConcurrent = MAX_CONCURRENT) {\n this.maxConcurrent_ = Math.max(1, maxConcurrent);\n }\n\n public enqueue(chunk: Chunk, fn: LoaderFn) {\n if (this.running_.has(chunk)) return;\n if (this.pending_.some((p) => p.chunk === chunk)) return;\n\n this.pending_.push({ chunk, fn });\n }\n\n public flush() {\n this.pump();\n }\n\n public cancel(chunk: Chunk) {\n const idx = this.pending_.findIndex((p) => p.chunk === chunk);\n if (idx >= 0) {\n this.pending_.splice(idx, 1);\n Logger.debug(\"ChunkQueue\", \"Cancelled pending request\");\n return;\n }\n\n const running = this.running_.get(chunk);\n if (running) {\n running.controller.abort();\n Logger.debug(\"ChunkQueue\", \"Cancelled fetch request\");\n }\n }\n\n public get pendingCount() {\n return this.pending_.length;\n }\n\n public get runningCount() {\n return this.running_.size;\n }\n\n private pump() {\n if (\n this.running_.size >= this.maxConcurrent_ ||\n this.pending_.length === 0\n ) {\n return;\n }\n\n this.pending_.sort((a, b) => {\n const priorityA = a.chunk.priority ?? Number.MAX_SAFE_INTEGER;\n const priorityB = b.chunk.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (priorityA === priorityB) {\n return (\n (a.chunk.orderKey ?? Number.MAX_SAFE_INTEGER) -\n (b.chunk.orderKey ?? Number.MAX_SAFE_INTEGER)\n );\n }\n\n return priorityA - priorityB;\n });\n\n while (\n this.running_.size < this.maxConcurrent_ &&\n this.pending_.length > 0\n ) {\n this.start(this.pending_.shift()!);\n }\n }\n\n private start(item: PendingItem) {\n const { chunk, fn } = item;\n chunk.state = \"loading\";\n\n const controller = new AbortController();\n const promise = Promise.resolve()\n .then(() => fn(controller.signal))\n .then(\n () => {\n if (chunk.state === \"loading\") chunk.state = \"loaded\";\n },\n (err) => {\n if (chunk.state === \"loading\") chunk.state = \"unloaded\";\n if (err.name !== \"AbortError\") {\n Logger.error(\"ChunkQueue\", String(err));\n }\n }\n )\n .finally(() => {\n this.running_.delete(chunk);\n this.pump();\n });\n\n this.running_.set(chunk, { controller, promise });\n }\n}\n","import { Region } from \"./region\";\nimport { TextureUnpackRowAlignment } from \"../objects/textures/texture\";\nimport { PromiseScheduler } from \"./promise_scheduler\";\nimport { Logger } from \"../utilities/logger\";\n\nconst chunkDataTypes = [\n Int8Array,\n Int16Array,\n Int32Array,\n Uint8Array,\n Uint16Array,\n Uint32Array,\n Float32Array,\n] as const;\nexport type ChunkDataConstructor = (typeof chunkDataTypes)[number];\nexport type ChunkData = InstanceType<ChunkDataConstructor>;\n\nexport function isChunkData(value: unknown): value is ChunkData {\n if (chunkDataTypes.some((ChunkData) => value instanceof ChunkData)) {\n return true;\n }\n const supportedDataTypeNames = chunkDataTypes.map((dtype) => dtype.name);\n Logger.debug(\n \"Chunk\",\n `Unsupported chunk data type: ${value}. Supported data types: ${supportedDataTypeNames}`\n );\n return false;\n}\n\nexport type ChunkViewState = {\n visible: boolean;\n prefetch: boolean;\n priority: number | null;\n orderKey: number | null;\n};\n\nexport type Chunk = {\n data?: ChunkData;\n state: \"unloaded\" | \"queued\" | \"loading\" | \"loaded\";\n lod: number;\n shape: {\n x: number;\n y: number;\n z: number;\n c: number;\n };\n rowAlignmentBytes: TextureUnpackRowAlignment;\n chunkIndex: {\n x: number;\n y: number;\n z: number;\n c: number;\n t: number;\n };\n scale: {\n x: number;\n y: number;\n z: number;\n };\n offset: {\n x: number;\n y: number;\n z: number;\n };\n} & ChunkViewState;\n\n// Maps Idetik spatial dimensions (x, y, z) and non-spatial dimensions (c, t)\n// dimensions to a chunk source's dimensions.\nexport type SourceDimensionMap = {\n x: SourceDimension;\n y: SourceDimension;\n z?: SourceDimension;\n c?: SourceDimension;\n t?: SourceDimension;\n numLods: number;\n};\n\n// A dimension in a chunk source with multiple levels of detail (LODs).\nexport type SourceDimension = {\n name: string;\n index: number;\n unit?: string;\n lods: SourceDimensionLod[];\n};\n\n// Metadata for a source dimension at a specific level of detail (LOD)\n// of a multi-resolution image pyramid.\n// For example, combines zarr array metadata (size, chunkSize) with\n// OME-zarr coordinate transform (scale, translation).\nexport type SourceDimensionLod = {\n size: number;\n chunkSize: number;\n scale: number;\n translation: number;\n};\n\nexport type SliceCoordinates = {\n z?: number;\n c?: number;\n t?: number;\n};\n\nexport type ChunkSource = {\n open(): Promise<ChunkLoader>;\n};\n\nexport type LoaderAttributes = {\n dimensionNames: string[];\n dimensionUnits: (string | undefined)[];\n chunks: readonly number[];\n shape: readonly number[];\n scale: readonly number[];\n translation: readonly number[];\n};\n\nexport type ChunkLoader = {\n loadRegion(\n input: Region,\n lod: number,\n scheduler?: PromiseScheduler\n ): Promise<Chunk>;\n\n getSourceDimensionMap(): SourceDimensionMap;\n\n loadChunkData(chunk: Chunk, signal: AbortSignal): Promise<void>;\n\n getAttributes(): ReadonlyArray<LoaderAttributes>;\n};\n\nexport function coordToIndex(lod: SourceDimensionLod, coord: number): number {\n return Math.round((coord - lod.translation) / lod.scale);\n}\n\nexport function coordToChunkIndex(\n lod: SourceDimensionLod,\n coord: number\n): number {\n const index = coordToIndex(lod, coord);\n return Math.floor(index / lod.chunkSize);\n}\n","export function almostEqual(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n","import {\n Chunk,\n SourceDimensionMap,\n ChunkLoader,\n SliceCoordinates,\n coordToIndex,\n} from \"../data/chunk\";\nimport { almostEqual } from \"../utilities/almost_equal\";\n\nexport class ChunkStore {\n private readonly chunks_: Chunk[][];\n private readonly loader_: ChunkLoader;\n private readonly lowestResLOD_: number;\n private readonly dimensions_: SourceDimensionMap;\n\n constructor(loader: ChunkLoader) {\n this.loader_ = loader;\n this.dimensions_ = this.loader_.getSourceDimensionMap();\n this.lowestResLOD_ = this.dimensions_.numLods - 1;\n\n this.validateXYScaleRatios();\n const { size: chunksT } = this.getAndValidateTimeDimension();\n const { size: chunksC } = this.getAndValidateChannelDimension();\n\n this.chunks_ = Array.from({ length: chunksT }, () => []);\n for (let t = 0; t < chunksT; ++t) {\n const chunksAtT = this.chunks_[t];\n for (let lod = 0; lod < this.dimensions_.numLods; ++lod) {\n const xLod = this.dimensions_.x.lods[lod];\n const yLod = this.dimensions_.y.lods[lod];\n const zLod = this.dimensions_.z?.lods[lod];\n\n const chunkWidth = xLod.chunkSize;\n const chunkHeight = yLod.chunkSize;\n const chunkDepth = zLod?.chunkSize ?? 1;\n\n const chunksX = Math.ceil(xLod.size / chunkWidth);\n const chunksY = Math.ceil(yLod.size / chunkHeight);\n const chunksZ = Math.ceil((zLod?.size ?? 1) / chunkDepth);\n\n for (let c = 0; c < chunksC; ++c) {\n for (let x = 0; x < chunksX; ++x) {\n const xOffset = xLod.translation + x * xLod.chunkSize * xLod.scale;\n for (let y = 0; y < chunksY; ++y) {\n const yOffset =\n yLod.translation + y * yLod.chunkSize * yLod.scale;\n for (let z = 0; z < chunksZ; ++z) {\n const zOffset =\n zLod !== undefined\n ? zLod.translation + z * chunkDepth * zLod.scale\n : 0;\n chunksAtT.push({\n state: \"unloaded\",\n lod,\n visible: false,\n prefetch: false,\n priority: null,\n orderKey: null,\n shape: {\n x: Math.min(chunkWidth, xLod.size - x * chunkWidth),\n y: Math.min(chunkHeight, yLod.size - y * chunkHeight),\n z: Math.min(chunkDepth, (zLod?.size ?? 1) - z * chunkDepth),\n c: 1,\n },\n rowAlignmentBytes: 1,\n chunkIndex: { x, y, z, c, t },\n scale: {\n x: xLod.scale,\n y: yLod.scale,\n z: zLod?.scale ?? 1,\n },\n offset: {\n x: xOffset,\n y: yOffset,\n z: zOffset,\n },\n });\n }\n }\n }\n }\n }\n }\n }\n\n public getChunksAtTime(timeIndex: number): Chunk[] {\n return this.chunks_[timeIndex];\n }\n\n public getTimeIndex(sliceCoords: SliceCoordinates): number {\n if (sliceCoords.t === undefined) return 0;\n if (this.dimensions_.t === undefined) return 0;\n return coordToIndex(this.dimensions_.t.lods[0], sliceCoords.t);\n }\n\n public get lodCount() {\n return this.lowestResLOD_ + 1;\n }\n\n public get dimensions() {\n return this.dimensions_;\n }\n\n public getLowestResLOD(): number {\n return this.lowestResLOD_;\n }\n\n public loadChunkData(chunk: Chunk, signal: AbortSignal) {\n return this.loader_.loadChunkData(chunk, signal);\n }\n\n private validateXYScaleRatios(): void {\n // Validates that each LOD level is downsampled by a factor of 2 in X and Y.\n // Z downsampling is not validated here because it's not guaranteed.\n const xDim = this.dimensions_.x;\n const yDim = this.dimensions_.y;\n for (let i = 1; i < this.dimensions_.numLods; i++) {\n const rx = xDim.lods[i].scale / xDim.lods[i - 1].scale;\n const ry = yDim.lods[i].scale / yDim.lods[i - 1].scale;\n\n if (!almostEqual(rx, 2, 0.02) || !almostEqual(ry, 2, 0.02)) {\n throw new Error(\n `Invalid downsampling factor between levels ${i - 1} → ${i}: ` +\n `expected (2× in X and Y), but got ` +\n `(${rx.toFixed(2)}×, ${ry.toFixed(2)}×) from scale ` +\n `[${xDim.lods[i - 1].scale}, ${yDim.lods[i - 1].scale}] → [${xDim.lods[i].scale}, ${yDim.lods[i].scale}]`\n );\n }\n }\n }\n\n private getAndValidateTimeDimension() {\n for (let lod = 0; lod < this.dimensions_.numLods; ++lod) {\n const tLod = this.dimensions_.t?.lods[lod];\n if (!tLod) continue;\n if (tLod.chunkSize !== 1) {\n throw new Error(\n `ChunkStore only supports a chunk size of 1 in t. Found ${tLod.chunkSize} at LOD ${lod}`\n );\n }\n const prevTLod = this.dimensions_.t?.lods[lod - 1];\n if (!prevTLod) continue;\n if (tLod.size !== prevTLod.size) {\n throw new Error(\n `ChunkStore does not support downsampling in t. Found ${prevTLod.size} at LOD ${lod - 1} → ${tLod.size} at LOD ${lod}`\n );\n }\n }\n return {\n size: this.dimensions_.t?.lods[0].size ?? 1,\n };\n }\n\n private getAndValidateChannelDimension() {\n for (let lod = 0; lod < this.dimensions_.numLods; ++lod) {\n const cLod = this.dimensions_.c?.lods[lod];\n if (!cLod) continue;\n if (cLod.chunkSize !== 1) {\n throw new Error(\n `ChunkStore only supports a chunk size of 1 in c. Found ${cLod.chunkSize} at LOD ${lod}`\n );\n }\n if (cLod.scale !== 1) {\n throw new Error(\n `ChunkStore does not support scale in c. Found ${cLod.scale} at LOD ${lod}`\n );\n }\n if (cLod.translation !== 0) {\n throw new Error(\n `ChunkStore does not support translation in c. Found ${cLod.translation} at LOD ${lod}`\n );\n }\n const prevCLod = this.dimensions_.c?.lods[lod - 1];\n if (!prevCLod) continue;\n if (cLod.size !== prevCLod.size) {\n throw new Error(\n `ChunkStore does not support downsampling in c. Found ${prevCLod.size} at LOD ${lod - 1} → ${cLod.size} at LOD ${lod}`\n );\n }\n }\n return {\n size: this.dimensions_.c?.lods[0].size ?? 1,\n };\n }\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { Chunk, SliceCoordinates, ChunkViewState } from \"../data/chunk\";\nimport { ChunkStore } from \"./chunk_store\";\nimport { Viewport } from \"./viewport\";\nimport { OrthographicCamera } from \"../objects/cameras/orthographic_camera\";\nimport { ImageSourcePolicy } from \"./image_source_policy\";\nimport { ReadonlyVec2, vec2, vec3 } from \"gl-matrix\";\nimport { Box2 } from \"../math/box2\";\nimport { Box3 } from \"../math/box3\";\nimport { Logger } from \"../utilities/logger\";\nimport { clamp } from \"../utilities/clamp\";\n\n/*\nUnique symbol used as a capability token to allow internal modules to update\nthe image source policy. Only code that imports this symbol can call\nsetImageSourcePolicy; all other callers will be rejected. Acts like a \"friend\"\naccess key, preventing accidental external mutation.\n*/\nexport const INTERNAL_POLICY_KEY = Symbol(\"INTERNAL_POLICY_KEY\");\n\nexport class ChunkStoreView {\n private readonly store_: ChunkStore;\n private policy_: ImageSourcePolicy;\n private policyChanged_ = false;\n private currentLOD_: number = 0;\n private lastViewBounds2D_: Box2 | null = null;\n private lastZBounds_?: [number, number];\n private lastTCoord_?: number;\n\n private sourceMaxSquareDistance2D_: number;\n private readonly chunkViewStates_: Map<Chunk, ChunkViewState> = new Map();\n\n constructor(store: ChunkStore, policy: ImageSourcePolicy) {\n this.store_ = store;\n this.policy_ = policy;\n\n Logger.info(\n \"ChunkStoreView\",\n \"Using image source policy:\",\n this.policy_.profile\n );\n\n const dimensions = this.store_.dimensions;\n const xLod0 = dimensions.x.lods[0];\n const yLod0 = dimensions.y.lods[0];\n this.sourceMaxSquareDistance2D_ = vec2.squaredLength(\n vec2.fromValues(xLod0.size * xLod0.scale, yLod0.size * yLod0.scale)\n );\n }\n\n public get store(): ChunkStore {\n return this.store_;\n }\n\n public get chunkViewStates(): ReadonlyMap<Chunk, ChunkViewState> {\n return this.chunkViewStates_;\n }\n\n public getChunksToRender(sliceCoords: SliceCoordinates): Chunk[] {\n const currentTimeIndex = this.store_.getTimeIndex(sliceCoords);\n const currentTimeChunks = this.store_.getChunksAtTime(currentTimeIndex);\n const currentLODChunks = currentTimeChunks.filter(\n (chunk) =>\n chunk.lod === this.currentLOD_ &&\n this.chunkViewStates_.get(chunk)?.visible === true &&\n chunk.state === \"loaded\"\n );\n\n // If we're at the lowest resolution LOD, only return current LOD chunks\n const lowestResLOD = this.store_.getLowestResLOD();\n if (this.currentLOD_ === lowestResLOD) {\n return currentLODChunks;\n }\n\n const lowResChunks = currentTimeChunks.filter(\n (chunk) =>\n chunk.lod === lowestResLOD &&\n this.chunkViewStates_.get(chunk)?.visible === true &&\n chunk.state === \"loaded\"\n );\n\n return [...lowResChunks, ...currentLODChunks];\n }\n\n public updateChunkStates(\n sliceCoords: SliceCoordinates,\n viewport: Viewport\n ): void {\n const camera = viewport.camera;\n if (camera.type !== \"OrthographicCamera\") {\n throw new Error(\n \"ChunkStoreView currently supports only orthographic cameras. \" +\n \"Update the implementation before using a perspective camera.\"\n );\n }\n\n const orthoCamera = camera as OrthographicCamera;\n const viewBounds2D = orthoCamera.getWorldViewRect();\n const virtualWidth = Math.abs(viewBounds2D.max[0] - viewBounds2D.min[0]);\n const canvasElement = viewport.element as HTMLCanvasElement;\n const bufferWidth = viewport.getBoxRelativeTo(canvasElement).toRect().width;\n const virtualUnitsPerScreenPixel = virtualWidth / bufferWidth;\n const lodFactor = Math.log2(1 / virtualUnitsPerScreenPixel);\n\n this.setLOD(lodFactor);\n\n const zBounds = this.getZBounds(sliceCoords);\n const changed =\n this.policyChanged_ ||\n this.viewBounds2DChanged(viewBounds2D) ||\n this.zBoundsChanged(zBounds) ||\n this.lastTCoord_ !== sliceCoords.t;\n\n if (changed) {\n this.updateChunkViewStates(sliceCoords, viewBounds2D);\n\n this.policyChanged_ = false;\n this.lastViewBounds2D_ = viewBounds2D.clone();\n this.lastZBounds_ = zBounds;\n this.lastTCoord_ = sliceCoords.t;\n }\n }\n\n public allVisibleLowestLODLoaded(sliceCoords: SliceCoordinates): boolean {\n const timeIndex = this.store_.getTimeIndex(sliceCoords);\n const visibleChunks = this.store_\n .getChunksAtTime(timeIndex)\n .filter((c) => c.visible && c.lod === this.store_.getLowestResLOD());\n // Return false if there are no visible chunks (empty array .every() returns true)\n return (\n visibleChunks.length > 0 &&\n visibleChunks.every((c) => c.state === \"loaded\")\n );\n }\n\n public get currentLOD(): number {\n return this.currentLOD_;\n }\n\n public maybeForgetChunk(chunk: Chunk): void {\n const viewState = this.chunkViewStates_.get(chunk);\n if (\n viewState &&\n (viewState.visible || viewState.prefetch || viewState.priority !== null)\n ) {\n return;\n }\n this.chunkViewStates_.delete(chunk);\n }\n\n public setImageSourcePolicy(newPolicy: ImageSourcePolicy, key: symbol) {\n if (key !== INTERNAL_POLICY_KEY) {\n throw new Error(\"Unauthorized policy mutation\");\n }\n\n if (this.policy_ !== newPolicy) {\n this.policy_ = newPolicy;\n this.policyChanged_ = true;\n\n Logger.info(\n \"ChunkStoreView\",\n \"Using image source policy:\",\n this.policy_.profile\n );\n }\n }\n\n private setLOD(lodFactor: number): void {\n // `scale0` is the x pixel size (world units) at LOD 0.\n // With 2x downsampling per LOD, selection happens in log2 space.\n const dimensions = this.store_.dimensions;\n const scale0 = dimensions.x.lods[0].scale;\n const bias = this.policy_.lod.bias;\n\n // How many LOD 0 pixels per screen pixel, normalized by source scale and bias.\n const sourceAdjusted = bias - Math.log2(scale0) - lodFactor;\n const desiredLOD = Math.floor(sourceAdjusted);\n\n const lowestResLOD = this.store_.getLowestResLOD();\n // Intersect dataset bounds with policy bounds.\n const minPolicyLOD = Math.max(\n 0,\n Math.min(lowestResLOD, this.policy_.lod.min)\n );\n const maxPolicyLOD = Math.max(\n minPolicyLOD,\n Math.min(lowestResLOD, this.policy_.lod.max)\n );\n\n const target = clamp(desiredLOD, minPolicyLOD, maxPolicyLOD);\n if (target !== this.currentLOD_) {\n this.currentLOD_ = target;\n }\n }\n\n private updateChunkViewStates(\n sliceCoords: SliceCoordinates,\n viewBounds2D: Box2\n ): void {\n const currentTimeIndex = this.store_.getTimeIndex(sliceCoords);\n const currentTimeChunks = this.store_.getChunksAtTime(currentTimeIndex);\n\n if (currentTimeChunks.length === 0) {\n Logger.warn(\n \"ChunkStoreView\",\n \"updateChunkViewStates called with no chunks initialized\"\n );\n this.chunkViewStates_.clear();\n return;\n }\n\n const viewBoundsCenter2D = vec2.create();\n vec2.lerp(viewBoundsCenter2D, viewBounds2D.min, viewBounds2D.max, 0.5);\n\n const [zMin, zMax] = this.getZBounds(sliceCoords);\n const viewBounds3D = new Box3(\n vec3.fromValues(viewBounds2D.min[0], viewBounds2D.min[1], zMin),\n vec3.fromValues(viewBounds2D.max[0], viewBounds2D.max[1], zMax)\n );\n\n // reset all existing chunk view states to \"not needed\" to start\n // logic below will override this for chunks that are actually visible/prefetch\n this.chunkViewStates_.forEach(markUnused);\n\n this.updateChunksAtTimeIndex(\n currentTimeIndex,\n sliceCoords,\n viewBounds3D,\n viewBoundsCenter2D\n );\n\n if (sliceCoords.t !== undefined) {\n this.markTimeChunksForPrefetch(\n currentTimeIndex,\n viewBounds3D,\n viewBoundsCenter2D\n );\n }\n }\n\n private isChunkChannelInSlice(\n chunk: Chunk,\n sliceCoords: SliceCoordinates\n ): boolean {\n return sliceCoords.c === undefined || sliceCoords.c === chunk.chunkIndex.c;\n }\n\n private updateChunksAtTimeIndex(\n timeIndex: number,\n sliceCoords: SliceCoordinates,\n viewBounds3D: Box3,\n viewBounds2DCenter: ReadonlyVec2\n ): void {\n const paddedBounds = this.getPaddedBounds(viewBounds3D);\n\n const currentTimeChunks = this.store_.getChunksAtTime(timeIndex);\n\n for (const chunk of currentTimeChunks) {\n const isInBounds = this.isChunkWithinBounds(chunk, viewBounds3D);\n const isChannelInSlice = this.isChunkChannelInSlice(chunk, sliceCoords);\n\n const isCurrentLOD = chunk.lod === this.currentLOD_;\n const isFallbackLOD = chunk.lod === this.store_.getLowestResLOD();\n\n const prefetch =\n !isInBounds &&\n isChannelInSlice &&\n isCurrentLOD &&\n this.isChunkWithinBounds(chunk, paddedBounds);\n\n const visible = isInBounds && isChannelInSlice;\n const priority = this.computePriority(\n isFallbackLOD,\n isCurrentLOD,\n isInBounds,\n prefetch,\n isChannelInSlice\n );\n\n if (priority !== null) {\n const orderKey = this.squareDistance2D(chunk, viewBounds2DCenter);\n\n this.chunkViewStates_.set(chunk, {\n visible,\n prefetch,\n priority,\n orderKey,\n });\n }\n }\n }\n\n private markTimeChunksForPrefetch(\n currentTimeIndex: number,\n viewBounds3D: Box3,\n viewBoundsCenter2D: ReadonlyVec2\n ): void {\n const numTimePoints = this.store_.dimensions.t?.lods[0].size ?? 1;\n const tEnd = Math.min(\n numTimePoints - 1,\n currentTimeIndex + this.policy_.prefetch.t\n );\n for (let t = currentTimeIndex + 1; t <= tEnd; ++t) {\n for (const chunk of this.store_.getChunksAtTime(t)) {\n if (chunk.lod !== this.store_.getLowestResLOD()) continue;\n if (!this.isChunkWithinBounds(chunk, viewBounds3D)) continue;\n\n const priority = this.policy_.priorityMap[\"prefetchTime\"];\n const squareDistance = this.squareDistance2D(chunk, viewBoundsCenter2D);\n const normalizedDistance = clamp(\n squareDistance / this.sourceMaxSquareDistance2D_,\n 0,\n 1 - Number.EPSILON\n );\n const orderKey = t - currentTimeIndex + normalizedDistance;\n\n // Always set priority/orderKey to keep loaded chunks alive\n // Only unloaded chunks will be queued for loading\n this.chunkViewStates_.set(chunk, {\n visible: false,\n prefetch: true,\n priority,\n orderKey,\n });\n }\n }\n }\n\n private computePriority(\n isFallbackLOD: boolean,\n isCurrentLOD: boolean,\n isVisible: boolean,\n isPrefetch: boolean,\n isChannelInSlice: boolean\n ) {\n if (!isChannelInSlice) return null;\n\n const m = this.policy_.priorityMap;\n if (isFallbackLOD && isVisible) return m[\"fallbackVisible\"];\n if (isCurrentLOD && isVisible) return m[\"visibleCurrent\"];\n if (isFallbackLOD) return m[\"fallbackBackground\"];\n if (isCurrentLOD && isPrefetch) return m[\"prefetchSpace\"];\n\n return null;\n }\n\n private isChunkWithinBounds(chunk: Chunk, bounds: Box3): boolean {\n const chunkBounds = new Box3(\n vec3.fromValues(chunk.offset.x, chunk.offset.y, chunk.offset.z),\n vec3.fromValues(\n chunk.offset.x + chunk.shape.x * chunk.scale.x,\n chunk.offset.y + chunk.shape.y * chunk.scale.y,\n chunk.offset.z + chunk.shape.z * chunk.scale.z\n )\n );\n return Box3.intersects(chunkBounds, bounds);\n }\n\n private getZBounds(sliceCoords: SliceCoordinates): [number, number] {\n const zDim = this.store_.dimensions.z;\n if (zDim === undefined || sliceCoords.z === undefined) return [0, 1];\n\n const zLod = zDim.lods[this.currentLOD_];\n const zShape = zLod.size;\n const zScale = zLod.scale;\n const zTran = zLod.translation;\n const zPoint = Math.floor((sliceCoords.z - zTran) / zScale);\n const chunkDepth = zLod.chunkSize;\n\n const zChunk = Math.max(\n 0,\n Math.min(\n Math.floor(zPoint / chunkDepth),\n Math.ceil(zShape / chunkDepth) - 1\n )\n );\n\n return [\n zTran + zChunk * chunkDepth * zScale,\n zTran + (zChunk + 1) * chunkDepth * zScale,\n ];\n }\n\n private viewBounds2DChanged(newBounds: Box2): boolean {\n return (\n this.lastViewBounds2D_ === null ||\n !vec2.equals(this.lastViewBounds2D_.min, newBounds.min) ||\n !vec2.equals(this.lastViewBounds2D_.max, newBounds.max)\n );\n }\n\n private zBoundsChanged(newBounds: [number, number]): boolean {\n return !this.lastZBounds_ || !vec2.equals(this.lastZBounds_, newBounds);\n }\n\n private getPaddedBounds(bounds: Box3): Box3 {\n const dimensions = this.store_.dimensions;\n const xLod = dimensions.x.lods[this.currentLOD_];\n const yLod = dimensions.y.lods[this.currentLOD_];\n const zLod = dimensions.z?.lods[this.currentLOD_];\n\n const padX = xLod.chunkSize * xLod.scale * this.policy_.prefetch.x;\n const padY = yLod.chunkSize * yLod.scale * this.policy_.prefetch.y;\n\n let padZ = 0;\n if (zLod) {\n padZ = zLod.chunkSize * zLod.scale * this.policy_.prefetch.z;\n }\n\n return new Box3(\n vec3.fromValues(\n bounds.min[0] - padX,\n bounds.min[1] - padY,\n bounds.min[2] - padZ\n ),\n vec3.fromValues(\n bounds.max[0] + padX,\n bounds.max[1] + padY,\n bounds.max[2] + padZ\n )\n );\n }\n\n private squareDistance2D(chunk: Chunk, center: ReadonlyVec2): number {\n const chunkCenter = {\n x: chunk.offset.x + 0.5 * chunk.shape.x * chunk.scale.x,\n y: chunk.offset.y + 0.5 * chunk.shape.y * chunk.scale.y,\n };\n const dx = chunkCenter.x - center[0];\n const dy = chunkCenter.y - center[1];\n return dx * dx + dy * dy;\n }\n}\n\nfunction markUnused(state: ChunkViewState): void {\n state.visible = false;\n state.prefetch = false;\n state.priority = null;\n state.orderKey = null;\n}\n","import { Logger } from \"../utilities/logger\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { ChunkQueue } from \"../data/chunk_queue\";\nimport { ChunkStore } from \"./chunk_store\";\nimport { ChunkStoreView } from \"./chunk_store_view\";\nimport { ImageSourcePolicy } from \"./image_source_policy\";\n\nexport class ChunkManager {\n private readonly stores_ = new Map<ChunkSource, ChunkStore>();\n private readonly pendingStores_ = new Map<ChunkSource, Promise<ChunkStore>>();\n private readonly views_ = new Map<ChunkStore, ChunkStoreView[]>();\n private readonly queue_ = new ChunkQueue();\n\n public async addView(\n source: ChunkSource,\n policy: ImageSourcePolicy\n ): Promise<ChunkStoreView> {\n const store = await this.addSource(source);\n const view = new ChunkStoreView(store, policy);\n this.views_.set(store, (this.views_.get(store) ?? []).concat(view));\n return view;\n }\n\n public removeView(view: ChunkStoreView): void {\n const store = view.store;\n const source = this.getSourceForStore(store);\n\n const views = this.views_.get(store);\n if (!views) {\n throw new Error(\"Cannot remove view: store not managed by ChunkManager\");\n }\n\n const index = views.indexOf(view);\n if (index === -1) {\n throw new Error(\n `Cannot remove view: view not found in store's view list (source: ${source})`\n );\n }\n\n const affectedChunks = Array.from(view.chunkViewStates.keys());\n views.splice(index, 1);\n\n for (const chunk of affectedChunks) {\n this.aggregateChunkViewStates(chunk, store);\n }\n\n if (views.length === 0) {\n this.stores_.delete(source);\n this.views_.delete(store);\n }\n }\n\n private async addSource(source: ChunkSource): Promise<ChunkStore> {\n const existingOrPending =\n this.stores_.get(source) ?? this.pendingStores_.get(source);\n if (existingOrPending) {\n return existingOrPending;\n }\n\n const initializeStore = async () => {\n const loader = await source.open();\n const store = new ChunkStore(loader);\n this.stores_.set(source, store);\n this.pendingStores_.delete(source);\n return store;\n };\n\n const pending = initializeStore();\n this.pendingStores_.set(source, pending);\n return pending;\n }\n\n private getSourceForStore(store: ChunkStore): ChunkSource {\n for (const [source, s] of this.stores_) {\n if (s === store) {\n return source;\n }\n }\n throw new Error(\"Source not found for the given store.\");\n }\n\n public update() {\n for (const [_, store] of this.stores_) {\n const updatedChunks = this.updateAndCollectChunkChanges(store);\n\n for (const chunk of updatedChunks) {\n if (chunk.priority === null) {\n this.queue_.cancel(chunk);\n } else if (chunk.state === \"queued\") {\n this.queue_.enqueue(chunk, (signal) =>\n store.loadChunkData(chunk, signal)\n );\n }\n }\n }\n\n this.queue_.flush();\n }\n\n private updateAndCollectChunkChanges(store: ChunkStore): Set<Chunk> {\n const views = this.views_.get(store);\n if (!views) return new Set<Chunk>();\n const affectedChunks = new Set<Chunk>();\n for (const view of views) {\n for (const [chunk, _viewState] of view.chunkViewStates) {\n affectedChunks.add(chunk);\n }\n }\n\n for (const chunk of affectedChunks) {\n this.aggregateChunkViewStates(chunk, store);\n }\n\n return affectedChunks;\n }\n\n private aggregateChunkViewStates(chunk: Chunk, store: ChunkStore): void {\n const views = this.views_.get(store);\n if (!views) return;\n let anyVisible = false;\n let anyPrefetch = false;\n let minPriority: number | null = null;\n let orderKeyForMinPriority: number | null = null;\n\n for (const view of views) {\n const viewState = view.chunkViewStates.get(chunk);\n if (!viewState) continue;\n\n if (viewState.visible) anyVisible = true;\n if (viewState.prefetch) anyPrefetch = true;\n\n if (viewState.priority !== null) {\n if (minPriority === null || viewState.priority < minPriority) {\n minPriority = viewState.priority;\n orderKeyForMinPriority = viewState.orderKey;\n }\n }\n\n if (\n !viewState.visible &&\n !viewState.prefetch &&\n viewState.priority === null\n ) {\n view.maybeForgetChunk(chunk);\n }\n }\n\n chunk.visible = anyVisible;\n chunk.prefetch = anyPrefetch;\n chunk.priority = minPriority;\n chunk.orderKey = orderKeyForMinPriority;\n\n const shouldEnqueueChunk =\n chunk.priority !== null && chunk.state === \"unloaded\";\n if (shouldEnqueueChunk) {\n chunk.state = \"queued\";\n return;\n }\n\n const shouldCancelQueuedChunk =\n chunk.priority === null && chunk.state === \"queued\";\n if (shouldCancelQueuedChunk) {\n chunk.state = \"unloaded\";\n return;\n }\n\n const shouldDisposeChunk =\n chunk.state === \"loaded\" && !chunk.visible && !chunk.prefetch;\n if (shouldDisposeChunk) {\n chunk.data = undefined;\n chunk.state = \"unloaded\";\n chunk.priority = null;\n chunk.orderKey = null;\n chunk.prefetch = false;\n Logger.debug(\n \"ChunkManager\",\n `Disposing chunk ${JSON.stringify(chunk.chunkIndex)} in LOD ${chunk.lod}`\n );\n }\n }\n}\n","/**\n * @author mrdoob / http://mrdoob.com/\n *\n * Modified to add resizing support via the `scale` parameter.\n */\n\nvar Stats = function(scale = 1) {\n\n var mode = 0;\n\n var container = document.createElement('div');\n container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n container.addEventListener('click', function(event) {\n\n event.preventDefault();\n showPanel(++mode % container.children.length);\n\n }, false);\n\n //\n\n function addPanel(panel) {\n\n container.appendChild(panel.dom);\n return panel;\n\n }\n\n function showPanel(id) {\n\n for (var i = 0; i < container.children.length; i++) {\n\n container.children[i].style.display = i === id ? 'block' : 'none';\n\n }\n\n mode = id;\n\n }\n\n //\n\n var beginTime = (performance || Date).now(), prevTime = beginTime, frames = 0;\n\n var fpsPanel = addPanel(new Stats.Panel('FPS', '#0ff', '#002', scale));\n var msPanel = addPanel(new Stats.Panel('MS', '#0f0', '#020', scale));\n\n if (self.performance && self.performance.memory) {\n\n var memPanel = addPanel(new Stats.Panel('MB', '#f08', '#201', scale));\n\n }\n\n showPanel(0);\n\n return {\n\n REVISION: 16,\n\n dom: container,\n\n addPanel: addPanel,\n showPanel: showPanel,\n\n begin: function() {\n\n beginTime = (performance || Date).now();\n\n },\n\n end: function() {\n\n frames++;\n\n var time = (performance || Date).now();\n\n msPanel.update(time - beginTime, 200);\n\n if (time >= prevTime + 1000) {\n\n fpsPanel.update((frames * 1000) / (time - prevTime), 100);\n\n prevTime = time;\n frames = 0;\n\n if (memPanel) {\n\n var memory = performance.memory;\n memPanel.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576);\n\n }\n\n }\n\n return time;\n\n },\n\n update: function() {\n\n beginTime = this.end();\n\n },\n\n // Backwards Compatibility\n\n domElement: container,\n setMode: showPanel\n\n };\n\n};\n\nStats.Panel = function(name, fg, bg, scale) {\n\n var min = Infinity, max = 0, round = Math.round;\n var PR = round(window.devicePixelRatio || 1);\n\n var WIDTH = round(80 * PR * scale);\n var HEIGHT = round(48 * PR * scale);\n var TEXT_X = round(3 * PR * scale);\n var TEXT_Y = round(2 * PR * scale);\n var GRAPH_X = round(3 * PR * scale);\n var GRAPH_Y = round(15 * PR * scale);\n var GRAPH_WIDTH = round(74 * PR * scale);\n var GRAPH_HEIGHT = round(30 * PR * scale);\n\n var canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n canvas.style.cssText = `width:${round(scale * 80)}px;height:${round(scale * 48)}px`;\n\n var context = canvas.getContext('2d');\n context.font = 'bold ' + round(9 * PR * scale) + 'px Helvetica,Arial,sans-serif';\n context.textBaseline = 'top';\n\n context.fillStyle = bg;\n context.fillRect(0, 0, WIDTH, HEIGHT);\n\n context.fillStyle = fg;\n context.fillText(name, TEXT_X, TEXT_Y);\n context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n context.fillStyle = bg;\n context.globalAlpha = 0.9;\n context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n return {\n\n dom: canvas,\n\n update: function(value, maxValue) {\n\n min = Math.min(min, value);\n max = Math.max(max, value);\n\n context.fillStyle = bg;\n context.globalAlpha = 1;\n context.fillRect(0, 0, WIDTH, GRAPH_Y);\n context.fillStyle = fg;\n context.fillText(round(value) + ' ' + name + ' (' + round(min) + '-' + round(max) + ')', TEXT_X, TEXT_Y);\n\n context.drawImage(canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT);\n\n context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT);\n\n context.fillStyle = bg;\n context.globalAlpha = 0.9;\n context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round((1 - (value / maxValue)) * GRAPH_HEIGHT));\n\n }\n\n };\n\n};\n\nexport { Stats as default };\n","import Stats, { type Stats as StatsType } from \"./vendored/stats.js\";\n\nexport function createStats({ scale } = { scale: 1.5 }): StatsType {\n const stats = new Stats(scale);\n stats.showPanel(0 /* 0 = fps, 1 = ms, 2 = mb */);\n document.body.appendChild(stats.dom);\n return stats;\n}\n\n// Re-export types from the vendored module\nexport type { Stats, StatsPanel } from \"./vendored/stats.js\";\n","import { Layer } from \"./layer\";\nimport { IdetikContext } from \"../idetik\";\n\nexport class LayerManager {\n private layers_: ReadonlyArray<Layer> = [];\n private callbacks_: Array<() => void> = [];\n\n private readonly context_: IdetikContext;\n\n constructor(context: IdetikContext) {\n this.context_ = context;\n }\n\n public partitionLayers(): {\n opaque: Layer[];\n transparent: Layer[];\n } {\n const opaque: Layer[] = [];\n const transparent: Layer[] = [];\n\n for (const layer of this.layers) {\n if (layer.transparent) {\n transparent.push(layer);\n } else {\n opaque.push(layer);\n }\n }\n\n return { opaque, transparent };\n }\n\n public add(layer: Layer) {\n this.layers_ = [...this.layers_, layer];\n layer.onAttached(this.context_);\n this.notifyLayersChanged();\n }\n\n public remove(layer: Layer) {\n const index = this.layers_.indexOf(layer);\n if (index === -1) {\n throw new Error(`Layer to remove not found: ${layer}`);\n }\n this.removeByIndex(index);\n }\n\n public removeByIndex(index: number) {\n const layer = this.layers_[index];\n if (layer) {\n layer.onDetached(this.context_);\n }\n this.layers_ = this.layers_.filter((_, i) => i !== index);\n this.notifyLayersChanged();\n }\n\n public removeAll() {\n for (const layer of this.layers_) {\n layer.onDetached(this.context_);\n }\n this.layers_ = [];\n this.notifyLayersChanged();\n }\n\n public get layers(): readonly Layer[] {\n return this.layers_;\n }\n\n private notifyLayersChanged(): void {\n for (const callback of this.callbacks_) {\n callback();\n }\n }\n\n public addLayersChangeCallback(callback: () => void): () => void {\n this.callbacks_.push(callback);\n return () => {\n this.removeLayersChangeCallback(callback);\n };\n }\n\n public removeLayersChangeCallback(callback: () => void): void {\n const index = this.callbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove not found: ${callback}`);\n }\n this.callbacks_.splice(index, 1);\n }\n}\n","import { vec3 } from \"gl-matrix\";\nimport { Logger } from \"../utilities/logger\";\n\nconst eventTypes = [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointercancel\",\n \"wheel\",\n] as const;\n\ntype EventType = (typeof eventTypes)[number];\nfunction isEventType(type: string): type is EventType {\n return (eventTypes as readonly string[]).includes(type);\n}\n\nexport class EventContext {\n private propagationStopped_: boolean = false;\n public readonly type: EventType;\n public readonly event?: Event;\n public worldPos?: vec3;\n public clipPos?: vec3;\n\n constructor(type: EventType, event?: Event) {\n this.type = type;\n this.event = event;\n }\n\n get propagationStopped() {\n return this.propagationStopped_;\n }\n\n stopPropagation() {\n this.propagationStopped_ = true;\n }\n}\n\ntype Listener = (event: EventContext) => void;\n\nexport class EventDispatcher {\n private readonly listeners_: Listener[] = [];\n private readonly element_: HTMLElement;\n private isConnected_ = false;\n\n constructor(element: HTMLElement) {\n this.element_ = element;\n }\n\n public addEventListener(listener: Listener) {\n this.listeners_.push(listener);\n }\n\n public connect() {\n if (this.isConnected_) {\n Logger.warn(\n \"EventDispatcher\",\n \"Attempted to connect already connected event dispatcher\",\n `element id: ${this.element_.id}`\n );\n return;\n }\n this.isConnected_ = true;\n eventTypes.forEach((type) => {\n this.element_.addEventListener(type, this.handleEvent, {\n passive: false,\n });\n });\n }\n\n public disconnect() {\n if (!this.isConnected_) {\n Logger.debug(\n \"EventDispatcher\",\n \"Attempted to disconnect already disconnected event dispatcher\",\n `element id: ${this.element_.id}`\n );\n return;\n }\n this.isConnected_ = false;\n eventTypes.forEach((type) => {\n this.element_.removeEventListener(type, this.handleEvent);\n });\n }\n\n private readonly handleEvent = (e: Event) => {\n if (!isEventType(e.type)) {\n Logger.error(\"EventDispatcher\", `Unsupported event type ${e.type}`);\n return;\n }\n\n const event = new EventContext(e.type, e);\n for (const listener of this.listeners_) {\n listener(event);\n if (event.propagationStopped) break;\n }\n };\n}\n","import { Camera } from \"../objects/cameras/camera\";\nimport { Layer } from \"./layer\";\nimport { LayerManager } from \"./layer_manager\";\nimport { CameraControls } from \"../objects/cameras/controls\";\nimport { Box2 } from \"../math/box2\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { generateUUID } from \"../utilities/uuid_generator\";\nimport { Logger } from \"../utilities/logger\";\nimport { EventContext, EventDispatcher } from \"./event_dispatcher\";\nimport { IdetikContext } from \"../idetik\";\n\nexport interface ViewportConfig {\n id?: string;\n element?: HTMLElement;\n camera: Camera;\n layers?: Layer[];\n cameraControls?: CameraControls;\n}\n\ninterface ViewportProps extends ViewportConfig {\n id: string;\n element: HTMLElement;\n layerManager: LayerManager;\n}\n\nexport class Viewport {\n public readonly id: string;\n public readonly element: HTMLElement;\n public readonly camera: Camera;\n public readonly layerManager: LayerManager;\n public readonly events: EventDispatcher;\n public cameraControls?: CameraControls;\n\n constructor(props: ViewportProps) {\n this.id = props.id;\n this.element = props.element;\n this.camera = props.camera;\n this.layerManager = props.layerManager;\n this.cameraControls = props.cameraControls;\n this.updateAspectRatio();\n this.events = new EventDispatcher(this.element);\n this.events.addEventListener((event: EventContext) => {\n if (\n event.event instanceof PointerEvent ||\n event.event instanceof WheelEvent\n ) {\n const { clientX, clientY } = event.event;\n const client = vec2.fromValues(clientX, clientY);\n event.clipPos = this.clientToClip(client, 0);\n event.worldPos = this.camera.clipToWorld(event.clipPos);\n }\n for (const layer of this.layerManager.layers) {\n layer.onEvent(event);\n if (event.propagationStopped) return;\n }\n this.cameraControls?.onEvent(event);\n });\n\n for (const layer of props.layers ?? []) {\n this.layerManager.add(layer);\n }\n }\n\n public updateSize(): void {\n this.updateAspectRatio();\n }\n\n public getBoxRelativeTo(canvas: HTMLCanvasElement): Box2 {\n const viewportRect = this.getBox().toRect();\n const canvasRect = canvas.getBoundingClientRect();\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // convert canvas rect to device pixels\n // viewport rect is already in device pixels\n const canvasX = canvasRect.left * devicePixelRatio;\n const canvasY = canvasRect.top * devicePixelRatio;\n const canvasHeight = canvasRect.height * devicePixelRatio;\n\n const relativeX = viewportRect.x - canvasX;\n const relativeY = viewportRect.y - canvasY;\n\n // Note: WebGL Y coordinate is flipped, so we adjust the Y position\n const x = Math.floor(relativeX);\n const y = Math.floor(canvasHeight - relativeY - viewportRect.height);\n const width = Math.floor(viewportRect.width);\n const height = Math.floor(viewportRect.height);\n\n return new Box2(\n vec2.fromValues(x, y),\n vec2.fromValues(x + width, y + height)\n );\n }\n\n public clientToClip(position: vec2, depth: number = 0): vec3 {\n const [x, y] = position;\n const rect = this.element.getBoundingClientRect();\n return vec3.fromValues(\n (2 * (x - rect.x)) / rect.width - 1,\n (2 * (y - rect.y)) / rect.height - 1,\n depth\n );\n }\n\n public clientToWorld(position: vec2, depth: number = 0): vec3 {\n const clipPos = this.clientToClip(position, depth);\n return this.camera.clipToWorld(clipPos);\n }\n\n private getBox(): Box2 {\n const viewportRect = this.element.getBoundingClientRect();\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n const x = viewportRect.left * devicePixelRatio;\n const y = viewportRect.top * devicePixelRatio;\n const width = viewportRect.width * devicePixelRatio;\n const height = viewportRect.height * devicePixelRatio;\n\n return new Box2(\n vec2.fromValues(x, y),\n vec2.fromValues(x + width, y + height)\n );\n }\n\n private updateAspectRatio(): void {\n const { width, height } = this.getBox().toRect();\n if (width <= 0 || height <= 0) {\n Logger.debug(\n \"Viewport\",\n `Skipping aspect ratio update for viewport ${this.id}: invalid dimensions ${width}x${height}`\n );\n return;\n }\n const aspectRatio = width / height;\n this.camera.setAspectRatio(aspectRatio);\n }\n}\n\nfunction validateViewportProps(viewportProps: ViewportProps[]): void {\n const elementToViewportId = new Map<HTMLElement, string>();\n const seenViewportIds = new Set<string>();\n\n for (const props of viewportProps) {\n if (seenViewportIds.has(props.id)) {\n throw new Error(\n `Duplicate viewport ID \"${props.id}\". Each viewport must have a unique ID.`\n );\n }\n seenViewportIds.add(props.id);\n\n if (elementToViewportId.has(props.element)) {\n const existingViewportId = elementToViewportId.get(props.element)!;\n const elementDescription =\n props.element.tagName.toLowerCase() +\n (props.element.id ? `#${props.element.id}` : \"[element has no id]\");\n throw new Error(\n \"Multiple viewports cannot share the same HTML element: \" +\n `viewports \"${existingViewportId}\" and \"${props.id}\" both use ${elementDescription}`\n );\n }\n elementToViewportId.set(props.element, props.id);\n }\n}\n\nexport function parseViewportConfigs(\n viewportConfigs: ViewportConfig[],\n canvas: HTMLCanvasElement,\n context: IdetikContext\n): Viewport[] {\n const viewportProps: ViewportProps[] = viewportConfigs.map((config) => {\n const element = config.element ?? canvas;\n return {\n ...config,\n element,\n id: config.id ?? element.id ?? generateUUID(),\n layerManager: new LayerManager(context),\n };\n });\n validateViewportProps(viewportProps);\n return viewportProps.map((props) => new Viewport(props));\n}\n","import { Logger } from \"./logger\";\n\n// Observes changes to the pixel size of HTML elements, including changes due to\n// window/device pixel ratio changes.\nexport class PixelSizeObserver {\n private elements_: ReadonlyArray<HTMLElement>;\n private resizeObserver_?: ResizeObserver;\n private mediaQuery_?: MediaQueryList;\n private onMediaQueryChange_?: () => void;\n private changed_ = false;\n\n constructor(elements: ReadonlyArray<HTMLElement> = []) {\n this.elements_ = elements;\n }\n\n public connect() {\n if (this.resizeObserver_) {\n Logger.warn(\n \"PixelSizeObserver\",\n \"Attempted to connect already connected observer\"\n );\n return;\n }\n this.resizeObserver_ = new ResizeObserver(() => {\n this.changed_ = true;\n });\n\n for (const element of this.elements_) {\n this.resizeObserver_.observe(element);\n }\n\n this.startDevicePixelRatioObserver();\n }\n\n public getAndResetChanged() {\n const wasChanged = this.changed_;\n this.changed_ = false;\n return wasChanged;\n }\n\n private startDevicePixelRatioObserver() {\n // this media query needs to be updated after a change is detected, so we use a one-time\n // event listener that re-registers itself with the new value\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#monitoring_screen_resolution_or_zoom_level_changes\n this.mediaQuery_ = matchMedia(\n `(resolution: ${window.devicePixelRatio}dppx)`\n );\n this.onMediaQueryChange_ = () => {\n this.changed_ = true;\n this.startDevicePixelRatioObserver();\n };\n this.mediaQuery_.addEventListener(\"change\", this.onMediaQueryChange_, {\n once: true,\n });\n }\n\n public disconnect() {\n if (!this.resizeObserver_) {\n Logger.warn(\n \"PixelSizeObserver\",\n \"Attempted to disconnect already disconnected observer\"\n );\n return;\n }\n this.resizeObserver_?.disconnect();\n if (this.mediaQuery_ && this.onMediaQueryChange_) {\n this.mediaQuery_.removeEventListener(\"change\", this.onMediaQueryChange_);\n }\n }\n}\n","import { WebGLRenderer } from \"./renderers/webgl_renderer\";\nimport { Logger } from \"./utilities/logger\";\nimport { ChunkManager } from \"./core/chunk_manager\";\nimport { createStats, type Stats } from \"./utilities/stats\";\nimport {\n parseViewportConfigs,\n Viewport,\n ViewportConfig,\n} from \"./core/viewport\";\nimport { PixelSizeObserver } from \"./utilities/pixel_size_observer\";\n\ntype Overlay = {\n update(idetik: Idetik, timestamp?: DOMHighResTimeStamp): void;\n};\n\ntype IdetikParams = {\n canvas: HTMLCanvasElement;\n viewports: [ViewportConfig, ...ViewportConfig[]]; // at least one viewport required\n overlays?: Overlay[];\n showStats?: boolean;\n};\n\nexport type IdetikContext = {\n chunkManager: ChunkManager;\n};\n\nexport class Idetik {\n private lastAnimationId_?: number;\n private readonly chunkManager_: ChunkManager;\n private readonly context_: IdetikContext;\n private readonly renderer_: WebGLRenderer;\n private readonly viewports_: Viewport[];\n public readonly canvas: HTMLCanvasElement;\n public readonly overlays: Overlay[];\n private readonly stats_?: Stats;\n private readonly sizeObserver_: PixelSizeObserver;\n\n /**\n * Creates a new Idetik visualization runtime instance.\n *\n * @param params - Configuration parameters for the Idetik instance\n * @param params.canvas - HTMLCanvasElement to render to\n * @param params.viewports - Array of viewport configurations. (At least one required.)\n * Each viewport renders with its own camera, layers, and controls.\n * The `element` property is optional and defaults to the canvas if not provided.\n * Elements must be unique across viewports.\n * The `id` property is optional but useful for referencing specific viewports later.\n * @param params.overlays - Optional array of overlay objects that update each frame (e.g., for HUD elements)\n * @param params.showStats - Optional flag to display performance statistics\n *\n * @example\n * // Single viewport (element defaults to canvas)\n * const camera = new OrthographicCamera(0, 1024, 0, 1024);\n * const idetik = new Idetik({\n * canvas: document.querySelector('canvas')!,\n * viewports: [{\n * camera: camera,\n * layers: [imageLayer],\n * cameraControls: new PanZoomControls(camera)\n * }]\n * });\n *\n * @example\n * // Multiple viewports - one defaults to canvas, others use separate elements\n * const idetik = new Idetik({\n * canvas: document.querySelector('canvas')!,\n * viewports: [\n * {\n * id: 'main',\n * // element omitted - defaults to canvas\n * camera: camera1,\n * layers: [layer1]\n * },\n * {\n * id: 'minimap',\n * element: document.querySelector('#minimap')!,\n * camera: camera2,\n * layers: [layer2]\n * }\n * ]\n * });\n *\n * @throws {Error} If viewports array is empty or not provided\n * @throws {Error} If viewports have duplicate IDs or shared elements\n */\n constructor(params: IdetikParams) {\n this.canvas = params.canvas;\n\n if (params.viewports.length === 0) {\n throw new Error(\"At least one viewport config must be specified.\");\n }\n\n this.renderer_ = new WebGLRenderer(this.canvas);\n this.chunkManager_ = new ChunkManager();\n this.context_ = {\n chunkManager: this.chunkManager_,\n };\n\n this.viewports_ = parseViewportConfigs(\n params.viewports,\n this.canvas,\n this.context_\n );\n\n this.overlays = params.overlays ?? [];\n\n if (params.showStats) this.stats_ = createStats();\n\n const sizeDependents: HTMLElement[] = [this.canvas];\n for (const viewport of this.viewports_) {\n if (viewport.element !== this.canvas) {\n sizeDependents.push(viewport.element);\n }\n }\n this.sizeObserver_ = new PixelSizeObserver(sizeDependents);\n }\n\n public get renderedObjects() {\n return this.renderer_.renderedObjects;\n }\n\n public get width() {\n return this.renderer_.width;\n }\n\n public get height() {\n return this.renderer_.height;\n }\n\n public get textureInfo() {\n return this.renderer_.textureInfo;\n }\n\n public get viewports(): readonly Viewport[] {\n return this.viewports_;\n }\n\n public getViewport(id: string): Viewport | undefined {\n return this.viewports_.find((v) => v.id === id);\n }\n\n public start() {\n Logger.info(\"Idetik\", \"Idetik runtime starting\");\n if (this.lastAnimationId_ === undefined) {\n for (const viewport of this.viewports_) {\n viewport.events.connect();\n }\n this.sizeObserver_.connect();\n this.animate();\n } else {\n Logger.warn(\"Idetik\", \"Idetik runtime already started\");\n }\n return this;\n }\n\n private animate(timestamp?: DOMHighResTimeStamp) {\n if (this.stats_) this.stats_.begin();\n\n // Must resize before render b/c changing canvas coordinate space clears it.\n if (this.sizeObserver_.getAndResetChanged()) {\n this.updateSize();\n }\n\n for (const viewport of this.viewports_) {\n this.renderer_.render(viewport);\n }\n\n this.chunkManager_.update();\n\n for (const overlay of this.overlays) {\n overlay.update(this, timestamp);\n }\n\n if (this.stats_) this.stats_.end();\n this.lastAnimationId_ = requestAnimationFrame((timestamp) =>\n this.animate(timestamp)\n );\n }\n\n public stop() {\n Logger.info(\"Idetik\", \"Idetik runtime stopping\");\n if (this.lastAnimationId_ === undefined) {\n Logger.warn(\"Idetik\", \"Idetik runtime not started\");\n } else {\n this.sizeObserver_.disconnect();\n for (const viewport of this.viewports_) {\n viewport.events.disconnect();\n }\n cancelAnimationFrame(this.lastAnimationId_);\n this.lastAnimationId_ = undefined;\n }\n }\n\n private updateSize() {\n this.renderer_.updateSize();\n for (const viewport of this.viewports_) {\n viewport.updateSize();\n }\n }\n}\n","import { Geometry } from \"./geometry\";\nimport { Logger } from \"../utilities/logger\";\n\nexport class WireframeGeometry extends Geometry {\n constructor(geometry: Geometry) {\n super();\n\n if (geometry.primitive != \"triangles\") {\n Logger.warn(\"WireframeGeometry\", \"Only indexed geometries are supported\");\n return;\n }\n\n if (geometry.indexData.length == 0) {\n Logger.warn(\n \"WireframeGeometry\",\n \"Only triangulated geometries are supported\"\n );\n return;\n }\n\n this.primitive_ = \"lines\";\n this.vertexData_ = geometry.vertexData;\n this.attributes_ = geometry.attributes;\n\n const edgeSet = new Set<{ i0: number; i1: number }>();\n const wireframeIndices: number[] = [];\n const addEdge = (a: number, b: number) => {\n // Normalize edge order and use a set to deduplicate,\n // since shared edges between triangles would otherwise\n // be added multiple times.\n const i0 = Math.min(a, b);\n const i1 = Math.max(a, b);\n if (!edgeSet.has({ i0, i1 })) {\n edgeSet.add({ i0, i1 });\n wireframeIndices.push(i0, i1);\n }\n };\n\n const index = geometry.indexData;\n for (let i = 0; i < index.length; i += 3) {\n const i0 = index[i];\n const i1 = index[i + 1];\n const i2 = index[i + 2];\n addEdge(i0, i1);\n addEdge(i1, i2);\n addEdge(i2, i0);\n }\n\n this.indexData_ = new Uint32Array(wireframeIndices);\n }\n}\n","import { mat4, mat3, vec3, quat, glMatrix } from \"gl-matrix\";\n\n// +Y is world up to match gl-matrix\nconst WORLD_UP = vec3.fromValues(0, 1, 0);\n\nexport class TrsTransform {\n private dirty_ = true;\n private matrix_ = mat4.create();\n private rotation_ = quat.create();\n private translation_ = vec3.create();\n private scale_ = vec3.fromValues(1, 1, 1);\n\n public addRotation(q: quat) {\n quat.multiply(this.rotation_, this.rotation_, q);\n this.dirty_ = true;\n }\n\n public setRotation(q: quat) {\n quat.copy(this.rotation_, q);\n this.dirty_ = true;\n }\n\n public get rotation() {\n return quat.clone(this.rotation_);\n }\n\n public addTranslation(vec: vec3) {\n vec3.add(this.translation_, this.translation_, vec);\n this.dirty_ = true;\n }\n\n public setTranslation(vec: vec3) {\n vec3.copy(this.translation_, vec);\n this.dirty_ = true;\n }\n\n public get translation() {\n return vec3.clone(this.translation_);\n }\n\n public addScale(vec: vec3) {\n vec3.multiply(this.scale_, this.scale_, vec);\n this.dirty_ = true;\n }\n\n public setScale(vec: vec3) {\n vec3.copy(this.scale_, vec);\n this.dirty_ = true;\n }\n\n public targetTo(target: vec3) {\n // Prevent zero-length forward vector by nudging\n // target slightly along +Z\n if (vec3.equals(this.translation_, target)) {\n target = vec3.clone(target);\n target[2] += glMatrix.EPSILON;\n }\n\n const m = mat4.targetTo(mat4.create(), this.translation_, target, WORLD_UP);\n const rotation = mat3.fromMat4(mat3.create(), m);\n quat.fromMat3(this.rotation_, rotation);\n quat.normalize(this.rotation_, this.rotation_);\n\n this.dirty_ = true;\n }\n\n public get scale() {\n return vec3.clone(this.scale_);\n }\n\n public get matrix() {\n if (this.dirty_) {\n this.computeMatrix();\n this.dirty_ = false;\n }\n return this.matrix_;\n }\n\n public get inverse() {\n return mat4.invert(mat4.create(), this.matrix);\n }\n\n private computeMatrix() {\n mat4.fromRotationTranslationScale(\n this.matrix_,\n this.rotation_,\n this.translation_,\n this.scale_\n );\n }\n}\n","import { Node } from \"../core/node\";\nimport { Geometry } from \"../core/geometry\";\nimport { WireframeGeometry } from \"../core/wireframe_geometry\";\nimport { Texture } from \"../objects/textures/texture\";\nimport { TrsTransform } from \"../core/transforms\";\nimport { Shader } from \"../renderers/shaders\";\nimport { Color } from \"../core/color\";\nimport { CullingMode } from \"../renderers/WebGLState\";\n\nexport abstract class RenderableObject extends Node {\n public wireframeEnabled = false;\n public wireframeColor = Color.WHITE;\n private readonly textures_: Texture[] = [];\n private staleTextures_: Texture[] = [];\n private readonly transform_ = new TrsTransform();\n private geometry_ = new Geometry();\n private wireframeGeometry_: WireframeGeometry | null = null;\n private programName_: Shader | null = null;\n private cullFaceMode_: CullingMode = \"none\";\n\n public setTexture(index: number, texture: Texture) {\n const oldTexture = this.textures_[index];\n if (oldTexture !== undefined) {\n this.staleTextures_.push(oldTexture);\n }\n this.textures_[index] = texture;\n }\n\n public popStaleTextures() {\n const stale = this.staleTextures_;\n this.staleTextures_ = [];\n return stale;\n }\n\n public get geometry() {\n return this.geometry_;\n }\n\n public get wireframeGeometry() {\n this.wireframeGeometry_ ??= new WireframeGeometry(this.geometry);\n return this.wireframeGeometry_;\n }\n\n public get textures() {\n return this.textures_;\n }\n\n public get transform() {\n return this.transform_;\n }\n\n public set geometry(geometry: Geometry) {\n this.geometry_ = geometry;\n this.wireframeGeometry_ = null;\n }\n\n public get programName(): Shader {\n if (this.programName_ === null) {\n throw new Error(\"Program name not set\");\n }\n return this.programName_;\n }\n\n public get boundingBox() {\n const box = this.geometry_.boundingBox.clone();\n box.applyTransform(this.transform_.matrix);\n return box;\n }\n\n protected set programName(programName: Shader) {\n this.programName_ = programName;\n }\n\n public get cullFaceMode() {\n return this.cullFaceMode_;\n }\n\n public set cullFaceMode(mode: CullingMode) {\n this.cullFaceMode_ = mode;\n }\n\n /**\n * Get uniforms for shader program. Override in derived classes that need custom uniforms.\n * @returns Object containing uniform name-value pairs\n */\n public getUniforms(): Record<string, unknown> {\n return {}; // Default implementation returns no uniforms\n }\n}\n","import { vec3 } from \"gl-matrix\";\n\nexport class Plane {\n public normal: vec3;\n public signedDistance: number;\n\n constructor(normal: vec3 = vec3.fromValues(0, 1, 0), distance = 0) {\n this.normal = vec3.clone(normal);\n this.signedDistance = distance;\n }\n\n public set(normal: vec3, distance: number) {\n this.normal = vec3.clone(normal);\n this.signedDistance = distance;\n }\n\n public signedDistanceToPoint(point: vec3) {\n // Algebraic convention ax + by + cz + d = 0\n // Negative values mean the point lies opposite the plane's normal\n return vec3.dot(this.normal, point) + this.signedDistance;\n }\n\n public normalize() {\n const len = vec3.length(this.normal);\n if (len > 0) {\n const inv = 1 / len;\n vec3.scale(this.normal, this.normal, inv);\n this.signedDistance *= inv;\n }\n }\n}\n","import { Plane } from \"./plane\";\nimport { Box3 } from \"./box3\";\nimport { mat4, vec3 } from \"gl-matrix\";\n\nexport class Frustum {\n private readonly planes_: [Plane, Plane, Plane, Plane, Plane, Plane];\n\n constructor(m: mat4) {\n this.planes_ = [\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n ];\n this.setWithViewProjection(m);\n }\n\n // Uses the fast plane-extraction algorithm described in\n // Gribb & Hartmann (1997): https://tinyurl.com/5x5htcwm\n public setWithViewProjection(m: mat4) {\n const n = vec3.create();\n\n // Left: row3 + row0\n this.planes_[0].set(\n vec3.set(n, m[3] + m[0], m[7] + m[4], m[11] + m[8]),\n m[15] + m[12]\n );\n\n // Right: row3 - row0\n this.planes_[1].set(\n vec3.set(n, m[3] - m[0], m[7] - m[4], m[11] - m[8]),\n m[15] - m[12]\n );\n\n // Top: row3 - row1\n this.planes_[2].set(\n vec3.set(n, m[3] - m[1], m[7] - m[5], m[11] - m[9]),\n m[15] - m[13]\n );\n\n // Bottom: row3 + row1\n this.planes_[3].set(\n vec3.set(n, m[3] + m[1], m[7] + m[5], m[11] + m[9]),\n m[15] + m[13]\n );\n\n // Near: row3 + row2\n this.planes_[4].set(\n vec3.set(n, m[3] + m[2], m[7] + m[6], m[11] + m[10]),\n m[15] + m[14]\n );\n\n // Far: row3 - row2\n this.planes_[5].set(\n vec3.set(n, m[3] - m[2], m[7] - m[6], m[11] - m[10]),\n m[15] - m[14]\n );\n\n for (const p of this.planes_) p.normalize();\n }\n\n public intersectsWithBox3(box: Box3) {\n const v = vec3.create();\n for (const plane of this.planes_) {\n const n = plane.normal;\n v[0] = n[0] > 0 ? box.max[0] : box.min[0];\n v[1] = n[1] > 0 ? box.max[1] : box.min[1];\n v[2] = n[2] > 0 ? box.max[2] : box.min[2];\n if (plane.signedDistanceToPoint(v) < 0) return false;\n }\n return true;\n }\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { Frustum } from \"../../math/frustum\";\nimport { mat4, vec3, vec4 } from \"gl-matrix\";\n\nexport type CameraType = \"OrthographicCamera\" | \"PerspectiveCamera\";\n\nexport abstract class Camera extends RenderableObject {\n protected projectionMatrix_ = mat4.create();\n protected near_ = 0;\n protected far_ = 0;\n\n protected abstract updateProjectionMatrix(): void;\n\n public abstract get type(): CameraType;\n\n public update() {\n this.updateProjectionMatrix();\n }\n\n get projectionMatrix() {\n return this.projectionMatrix_;\n }\n\n get viewMatrix() {\n return this.transform.inverse;\n }\n\n get right() {\n const m = this.transform.matrix;\n return vec3.fromValues(m[0], m[1], m[2]);\n }\n\n get up() {\n const m = this.transform.matrix;\n return vec3.fromValues(m[4], m[5], m[6]);\n }\n\n get frustum() {\n return new Frustum(\n mat4.multiply(mat4.create(), this.projectionMatrix, this.viewMatrix)\n );\n }\n\n public abstract setAspectRatio(aspectRatio: number): void;\n public abstract zoom(factor: number): void;\n\n public pan(vec: vec3) {\n this.transform.addTranslation(vec);\n }\n\n public get position() {\n return this.transform.translation;\n }\n\n public clipToWorld(position: vec3): vec3 {\n const clipPos = vec4.fromValues(position[0], position[1], position[2], 1);\n const projectionInverse = mat4.invert(\n mat4.create(),\n this.projectionMatrix_\n );\n const viewPos = vec4.transformMat4(\n vec4.create(),\n clipPos,\n projectionInverse\n );\n vec4.scale(viewPos, viewPos, 1 / viewPos[3]);\n // the camera transform is *not* inverted here because we use the inverse when rendering\n const worldPos = vec4.transformMat4(\n vec4.create(),\n viewPos,\n this.transform.matrix\n );\n return vec3.fromValues(worldPos[0], worldPos[1], worldPos[2]);\n }\n}\n","import { Camera, CameraType } from \"./camera\";\nimport { vec2, vec4, mat4 } from \"gl-matrix\";\nimport { Box2 } from \"../../math/box2\";\n\nconst DEFAULT_ASPECT_RATIO = 1.77; // 16:9\nconst DEFAULT_WIDTH = 128;\nconst DEFAULT_HEIGHT = 128 / DEFAULT_ASPECT_RATIO;\n\nexport class OrthographicCamera extends Camera {\n // width_ and height_ should always be defined by constructor (see setFrame)\n private width_: number = DEFAULT_WIDTH;\n private height_: number = DEFAULT_HEIGHT;\n private viewportAspectRatio_: number = DEFAULT_ASPECT_RATIO;\n private viewportSize_: [number, number] = [DEFAULT_WIDTH, DEFAULT_HEIGHT];\n\n constructor(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near = 0.0,\n far = 100.0\n ) {\n super();\n this.near_ = near;\n this.far_ = far;\n this.setFrame(left, right, bottom, top);\n this.updateProjectionMatrix();\n }\n\n public get viewportSize() {\n return this.viewportSize_;\n }\n\n public setAspectRatio(aspectRatio: number) {\n this.viewportAspectRatio_ = aspectRatio;\n this.updateProjectionMatrix();\n }\n\n public setFrame(left: number, right: number, bottom: number, top: number) {\n this.width_ = Math.abs(right - left);\n this.height_ = Math.abs(top - bottom);\n this.updateProjectionMatrix();\n const centerX = 0.5 * (left + right);\n const centerY = 0.5 * (bottom + top);\n this.transform.setTranslation([centerX, centerY, 0]);\n this.transform.setScale([1, 1, 1]);\n this.transform.setRotation([0, 0, 0, 1]);\n }\n\n public get type(): CameraType {\n return \"OrthographicCamera\";\n }\n\n public zoom(factor: number) {\n if (factor <= 0) {\n throw new Error(`Invalid zoom factor: ${factor}`);\n }\n const inverseFactor = 1.0 / factor;\n this.transform.addScale([inverseFactor, inverseFactor, 1.0]);\n }\n\n public getWorldViewRect(): Box2 {\n let topLeft = vec4.fromValues(-1.0, -1.0, 0.0, 1.0);\n let bottomRight = vec4.fromValues(1.0, 1.0, 0.0, 1.0);\n\n const viewProjection = mat4.multiply(\n mat4.create(),\n this.projectionMatrix,\n this.viewMatrix\n );\n\n const inv = mat4.invert(mat4.create(), viewProjection);\n topLeft = vec4.transformMat4(vec4.create(), topLeft, inv);\n bottomRight = vec4.transformMat4(vec4.create(), bottomRight, inv);\n\n return new Box2(\n vec2.fromValues(topLeft[0], topLeft[1]),\n vec2.fromValues(bottomRight[0], bottomRight[1])\n );\n }\n\n protected updateProjectionMatrix() {\n // The following code ensures that the orthographic projection matrix\n // is updated so that the aspect ratio of renderable objects is respected\n // (e.g. image pixels are isotropic) by padding the camera frame to form\n // the viewport frame.\n const width = this.width_;\n const height = this.height_;\n const frameAspectRatio = width / height;\n // When the viewport is wider than the camera frame, add horizontal\n // padding such that the height is unchanged. Otherwise, add vertical\n // padding such that the width is unchanged.\n let viewportHalfWidth = 0.5 * width;\n let viewportHalfHeight = 0.5 * height;\n if (this.viewportAspectRatio_ > frameAspectRatio) {\n viewportHalfWidth *= this.viewportAspectRatio_ / frameAspectRatio;\n } else {\n viewportHalfHeight *= frameAspectRatio / this.viewportAspectRatio_;\n }\n this.viewportSize_ = [2 * viewportHalfWidth, 2 * viewportHalfHeight];\n // Center the camera frame in the padded viewport frame.\n mat4.ortho(\n this.projectionMatrix_,\n -viewportHalfWidth,\n viewportHalfWidth,\n -viewportHalfHeight,\n viewportHalfHeight,\n this.near_,\n this.far_\n );\n }\n}\n","import { Camera, CameraType } from \"./camera\";\nimport { glMatrix, mat4, vec3 } from \"gl-matrix\";\n\nconst DEFAULT_FOV = 60; // degrees\nconst DEFAULT_ASPECT_RATIO = 1.77; // 16:9\nconst MIN_FOV = 0.1; // degrees\nconst MAX_FOV = 180 - MIN_FOV; // degrees\n\ntype PerspectiveCameraOptions = {\n fov?: number;\n aspectRatio?: number;\n near?: number;\n far?: number;\n position?: vec3;\n};\n\nexport class PerspectiveCamera extends Camera {\n private fov_: number;\n private aspectRatio_: number;\n\n constructor(options: PerspectiveCameraOptions = {}) {\n const {\n fov = DEFAULT_FOV,\n aspectRatio = DEFAULT_ASPECT_RATIO,\n near = 0.1,\n far = 10000,\n position = vec3.fromValues(0, 0, 0),\n } = options;\n\n if (fov < MIN_FOV || fov > MAX_FOV) {\n throw new Error(\n `Invalid field of view: ${fov}, must be in [${MIN_FOV}, ${MAX_FOV}] degrees`\n );\n }\n super();\n this.fov_ = fov;\n this.aspectRatio_ = aspectRatio;\n this.near_ = near;\n this.far_ = far;\n\n this.transform.setTranslation(position);\n\n this.updateProjectionMatrix();\n }\n\n public setAspectRatio(aspectRatio: number) {\n this.aspectRatio_ = aspectRatio;\n this.updateProjectionMatrix();\n }\n\n public get type(): CameraType {\n return \"PerspectiveCamera\";\n }\n\n public get fov() {\n return this.fov_;\n }\n\n public zoom(factor: number) {\n if (factor <= 0) {\n throw new Error(`Invalid zoom factor: ${factor}`);\n }\n // clamp the field of view to prevent degenerate behavior\n this.fov_ = Math.max(MIN_FOV, Math.min(MAX_FOV, this.fov_ / factor));\n this.updateProjectionMatrix();\n }\n\n protected updateProjectionMatrix() {\n mat4.perspective(\n this.projectionMatrix_,\n glMatrix.toRadian(this.fov),\n this.aspectRatio_,\n this.near_,\n this.far_\n );\n }\n}\n","import { vec3 } from \"gl-matrix\";\nimport { OrthographicCamera } from \"./orthographic_camera\";\nimport { EventContext } from \"../../core/event_dispatcher\";\n\nconst LEFT_MOUSE_BUTTON = 0;\n\nexport interface CameraControls {\n onEvent(event: EventContext): void;\n}\n\nexport class PanZoomControls implements CameraControls {\n private readonly camera_: OrthographicCamera;\n private dragActive_ = false;\n private dragStart_: vec3 = vec3.create();\n\n constructor(camera: OrthographicCamera) {\n this.camera_ = camera;\n }\n\n public onEvent(event: EventContext): void {\n switch (event.type) {\n case \"wheel\":\n this.onWheel(event);\n break;\n case \"pointerdown\":\n this.onPointerDown(event);\n break;\n case \"pointermove\":\n this.onPointerMove(event);\n break;\n case \"pointerup\":\n case \"pointercancel\":\n this.onPointerEnd(event);\n break;\n }\n }\n\n private onWheel(event: EventContext) {\n if (!event.worldPos || !event.clipPos) return;\n const e = event.event as WheelEvent;\n\n // Prevent the page from scrolling, the default action for wheel events.\n e.preventDefault();\n\n const posBeforeZoom = vec3.clone(event.worldPos);\n const zoomFactor = e.deltaY < 0 ? 1.05 : 0.95;\n\n this.camera_.zoom(zoomFactor);\n\n const posAfterZoom = this.camera_.clipToWorld(event.clipPos);\n const delta = vec3.sub(vec3.create(), posBeforeZoom, posAfterZoom);\n this.camera_.pan(delta);\n }\n\n private onPointerDown(event: EventContext) {\n const e = event.event as PointerEvent;\n if (!event.worldPos || e.button !== LEFT_MOUSE_BUTTON) return;\n\n this.dragStart_ = vec3.clone(event.worldPos);\n this.dragActive_ = true;\n\n (e.target as Element)?.setPointerCapture?.(e.pointerId);\n }\n\n private onPointerMove(event: EventContext) {\n if (!this.dragActive_ || !event.worldPos) return;\n\n const delta = vec3.sub(vec3.create(), this.dragStart_, event.worldPos);\n this.camera_.pan(delta);\n }\n\n private onPointerEnd(event: EventContext) {\n const e = event.event as PointerEvent;\n if (!this.dragActive_ || e.button !== LEFT_MOUSE_BUTTON) return;\n\n this.dragActive_ = false;\n\n (e.target as Element)?.releasePointerCapture?.(e.pointerId);\n }\n}\n","import { IdetikContext } from \"../idetik\";\nimport { RenderableObject } from \"./renderable_object\";\nimport { clamp } from \"../utilities/clamp\";\nimport { Logger } from \"../utilities/logger\";\nimport { EventContext } from \"./event_dispatcher\";\nimport { Viewport } from \"./viewport\";\n\nexport type LayerState = \"initialized\" | \"loading\" | \"ready\";\nexport type blendMode = \"normal\" | \"additive\" | \"subtractive\" | \"multiply\";\n\ntype StateChangeCallback = (\n newState: LayerState,\n prevState?: LayerState\n) => void;\n\nexport interface LayerOptions {\n transparent?: boolean;\n opacity?: number;\n blendMode?: blendMode;\n}\n\nexport type RenderContext = {\n viewport: Viewport;\n};\n\nexport abstract class Layer {\n public abstract readonly type: string;\n\n private objects_: RenderableObject[] = [];\n private state_: LayerState = \"initialized\";\n private readonly callbacks_: StateChangeCallback[] = [];\n\n public transparent: boolean;\n private opacity_: number;\n public blendMode: blendMode;\n\n constructor({\n transparent = false,\n opacity = 1.0,\n blendMode = \"normal\",\n }: LayerOptions = {}) {\n if (opacity < 0 || opacity > 1) {\n Logger.warn(\n \"Layer\",\n `Layer opacity out of bounds: ${opacity} — clamping to [0.0, 1.0]`\n );\n }\n this.transparent = transparent;\n this.opacity_ = clamp(opacity, 0.0, 1.0);\n this.blendMode = blendMode;\n }\n\n public get opacity() {\n return this.opacity_;\n }\n\n public set opacity(value: number) {\n if (value < 0 || value > 1) {\n Logger.warn(\n \"Layer\",\n `Opacity out of bounds: ${value} — clamping to [0.0, 1.0]`\n );\n }\n this.opacity_ = clamp(value, 0.0, 1.0);\n }\n\n public abstract update(context?: RenderContext): void;\n\n public onEvent(_: EventContext): void {}\n\n // TODO: Consider making this an abstract method once chunk manager\n // integration is finalized. Most layers will likely need access to the chunk\n // manager, but for now, we allow optional overrides to avoid requiring\n // placeholder implementations.\n public async onAttached(_context: IdetikContext) {}\n\n public onDetached(_context: IdetikContext): void {}\n\n public get objects() {\n return this.objects_;\n }\n\n public get state() {\n return this.state_;\n }\n\n public addStateChangeCallback(callback: StateChangeCallback) {\n this.callbacks_.push(callback);\n }\n\n public removeStateChangeCallback(callback: StateChangeCallback) {\n const index = this.callbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.callbacks_.splice(index, 1);\n }\n\n protected setState(newState: LayerState) {\n const prevState = this.state_;\n this.state_ = newState;\n this.callbacks_.forEach((callback) => callback(newState, prevState));\n }\n\n protected addObject(object: RenderableObject) {\n this.objects_.push(object);\n }\n\n protected removeObject(object: RenderableObject) {\n const index = this.objects_.indexOf(object);\n if (index !== -1) {\n this.objects_.splice(index, 1);\n }\n }\n\n protected clearObjects() {\n this.objects_ = [];\n }\n}\n","import { vec3 } from \"gl-matrix\";\n\nimport { Geometry } from \"../../core/geometry\";\n\nexport class ProjectedLineGeometry extends Geometry {\n // this creates the geometry for a screen-space projected line\n // each point on the input path is split into two vertices\n // these are pushed in opposite directions in screen-space to create width\n // this is done in the vertex shader by moving the vertices along the path normal\n // See:\n // https://mattdesl.svbtle.com/drawing-lines-is-hard#screenspace-projected-lines_2\n // https://github.com/spite/THREE.MeshLine\n constructor(path: vec3[]) {\n super();\n this.vertexData_ = this.createVertices(path);\n this.indexData_ = this.createIndex(path.length);\n this.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n this.addAttribute({\n type: \"previous_position\",\n itemSize: 3,\n offset: 3 * Float32Array.BYTES_PER_ELEMENT,\n });\n this.addAttribute({\n type: \"next_position\",\n itemSize: 3,\n offset: 6 * Float32Array.BYTES_PER_ELEMENT,\n });\n this.addAttribute({\n type: \"direction\",\n itemSize: 1,\n offset: 9 * Float32Array.BYTES_PER_ELEMENT,\n });\n this.addAttribute({\n type: \"path_proportion\",\n itemSize: 1,\n offset: 10 * Float32Array.BYTES_PER_ELEMENT,\n });\n }\n\n private createVertices(path: vec3[]): Float32Array {\n const vertices = new Float32Array(2 * path.length * (3 + 3 + 3 + 1 + 1));\n\n let c = 0;\n let path_proportion = 0.0;\n const total_distance = path.reduce((acc, curr, i) => {\n return acc + vec3.distance(curr, path[i + 1] ?? curr);\n }, 0.0);\n for (const i of [...Array(path.length).keys()]) {\n for (const direction of [-1.0, 1.0]) {\n const current = path[i];\n vertices[c++] = current[0];\n vertices[c++] = current[1];\n vertices[c++] = current[2];\n\n const previous = path[i - 1] ?? path[i];\n vertices[c++] = previous[0];\n vertices[c++] = previous[1];\n vertices[c++] = previous[2];\n\n const next = path[i + 1] ?? path[i];\n vertices[c++] = next[0];\n vertices[c++] = next[1];\n vertices[c++] = next[2];\n\n vertices[c++] = direction;\n vertices[c++] = path_proportion;\n }\n path_proportion +=\n vec3.distance(path[i], path[i + 1] ?? path[i]) / total_distance;\n }\n\n return vertices;\n }\n\n private createIndex(length: number): Uint32Array {\n // each line segment is a quad split into two triangles\n // 0 ----- 2\n // | / | ^\n // | / | +direction\n // point a / point b\n // | / | -direction\n // | / | v\n // 1 ----- 3\n\n const indices = new Uint32Array((length - 1) * 6);\n let c = 0;\n\n for (let i = 0; i < 2 * length; i += 2) {\n indices[c++] = i + 0;\n indices[c++] = i + 1;\n indices[c++] = i + 2;\n\n indices[c++] = i + 2;\n indices[c++] = i + 1;\n indices[c++] = i + 3;\n }\n return indices;\n }\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { ProjectedLineGeometry } from \"../../objects/geometry/projected_line_geometry\";\nimport { Color, ColorLike } from \"../../core/color\";\n\ntype LineParameters = {\n geometry: ProjectedLineGeometry;\n color: ColorLike;\n width: number;\n taperOffset?: number;\n taperPower?: number;\n};\n\nexport class ProjectedLine extends RenderableObject {\n private color_: Color;\n private width_: number;\n private taperOffset_: number = 0.5;\n private taperPower_: number = 0.0;\n\n constructor({\n geometry,\n color,\n width,\n taperOffset,\n taperPower,\n }: LineParameters) {\n super();\n this.geometry = geometry;\n this.color_ = Color.from(color);\n this.width_ = width;\n this.taperOffset_ = taperOffset ?? this.taperOffset_;\n this.taperPower_ = taperPower ?? this.taperPower_;\n this.programName = \"projectedLine\";\n }\n\n public get type() {\n return \"ProjectedLine\";\n }\n\n public get color(): Color {\n return this.color_;\n }\n\n public set color(value: ColorLike) {\n this.color_ = Color.from(value);\n }\n\n public get width() {\n return this.width_;\n }\n\n public set width(value: number) {\n this.width_ = value;\n }\n\n public get taperOffset() {\n return this.taperOffset_;\n }\n\n public set taperOffset(value: number) {\n this.taperOffset_ = value;\n }\n\n public get taperPower() {\n return this.taperPower_;\n }\n\n public set taperPower(value: number) {\n this.taperPower_ = value;\n }\n\n public override getUniforms() {\n return {\n LineColor: this.color.rgb,\n LineWidth: this.width,\n TaperOffset: this.taperOffset,\n TaperPower: this.taperPower,\n };\n }\n}\n","import { Layer } from \"../core/layer\";\nimport { ProjectedLineGeometry } from \"../objects/geometry/projected_line_geometry\";\nimport { ProjectedLine } from \"../objects/renderable/projected_line\";\n\nexport class AxesLayer extends Layer {\n public readonly type = \"AxesLayer\";\n\n constructor(params: { length: number; width: number }) {\n super();\n const { length, width } = params;\n this.addObject(\n makeAxis({\n end: [length, 0, 0],\n width: width,\n color: [1, 0, 0],\n })\n );\n this.addObject(\n makeAxis({\n end: [0, length, 0],\n width: width,\n color: [0, 1, 0],\n })\n );\n this.addObject(\n makeAxis({\n end: [0, 0, length],\n width: width,\n color: [0, 0, 1],\n })\n );\n this.setState(\"ready\");\n }\n\n public update() {}\n}\n\nfunction makeAxis(params: {\n end: [number, number, number];\n width: number;\n color: [number, number, number];\n}) {\n const { end, width, color } = params;\n const geometry = new ProjectedLineGeometry([[0, 0, 0], end]);\n return new ProjectedLine({\n geometry: geometry,\n color: color,\n width: width,\n });\n}\n","import { vec3 } from \"gl-matrix\";\nimport { Layer } from \"../core/layer\";\nimport { ProjectedLine } from \"../objects/renderable/projected_line\";\nimport { ProjectedLineGeometry } from \"../objects/geometry/projected_line_geometry\";\n\ntype LineParameters = {\n path: vec3[];\n color: vec3;\n width: number;\n};\n\nexport class ProjectedLineLayer extends Layer {\n public readonly type = \"ProjectedLineLayer\";\n\n private paths_: vec3[][] = [];\n\n constructor(lines: LineParameters[] = []) {\n super();\n lines.forEach((line) => this.addLine(line));\n this.setState(\"ready\");\n }\n\n private addLine(line: LineParameters) {\n const { path, color, width } = line;\n this.paths_.push(path);\n const geometry = new ProjectedLineGeometry(path);\n this.addObject(new ProjectedLine({ geometry, color, width }));\n }\n\n public update() {}\n\n // TODO: this is temporary - we may want to generalize this to all layers\n // for now it is used to set the initial camera position to be centered on the tracks\n public get extent() {\n return getPathBoundingBox(this.paths_.flat());\n }\n}\n\ntype BoundingBox3D = {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n zMin: number;\n zMax: number;\n};\n\nfunction getPathBoundingBox(path: vec3[]): BoundingBox3D {\n function getAxisBounds(index: number): [number, number] {\n const values = path.map((point) => point[index]);\n return [Math.min(...values), Math.max(...values)];\n }\n\n const [xMin, xMax] = getAxisBounds(0);\n const [yMin, yMax] = getAxisBounds(1);\n const [zMin, zMax] = getAxisBounds(2);\n\n return { xMin, xMax, yMin, yMax, zMin, zMax };\n}\n","import { vec3 } from \"gl-matrix\";\nimport { Layer } from \"../core/layer\";\nimport { ProjectedLine } from \"../objects/renderable/projected_line\";\nimport { ProjectedLineGeometry } from \"../objects/geometry/projected_line_geometry\";\n\ntype TrackParameters = {\n path: vec3[];\n interpolation?: { pointsPerSegment: number; tangentFactor?: number };\n time?: number[];\n color: vec3;\n width: number;\n};\n\nexport class TracksLayer extends Layer {\n public readonly type = \"TracksLayer\";\n\n private tracks_: TrackParameters[] = [];\n\n constructor(tracks: TrackParameters[] = []) {\n super();\n tracks.forEach((track) => this.addLine(track));\n this.setState(\"ready\");\n }\n\n private addLine(track: TrackParameters) {\n this.tracks_.push(track);\n let geometry;\n if (track.interpolation) {\n const interpolatedPath = cubicBezierInterpolation({\n path: track.path,\n pointsPerSegment: track.interpolation.pointsPerSegment,\n tangentFactor: track.interpolation.tangentFactor,\n });\n geometry = new ProjectedLineGeometry(interpolatedPath);\n } else {\n geometry = new ProjectedLineGeometry(track.path);\n }\n const { color, width } = track;\n const taperOffset = 0.5;\n const taperPower = 1.5;\n this.addObject(\n new ProjectedLine({ geometry, color, width, taperOffset, taperPower })\n );\n }\n\n public setTimeIndex(index: number) {\n for (const [i, track] of this.tracks_.entries()) {\n if (!track.time) {\n continue;\n }\n let offset = 0.5;\n if (index < track.time[0]) {\n offset = -1.5;\n } else if (index > track.time[track.time.length - 1]) {\n offset = 1.5;\n }\n const timeIndex = track.time.findIndex((time) => time === index);\n if (track.time && timeIndex !== -1) {\n offset = timeIndex / (track.time.length - 1);\n }\n const object = this.objects[i] as ProjectedLine;\n object.taperOffset = offset;\n }\n }\n\n public update() {}\n\n // TODO: this is temporary - we may want to generalize this to all layers\n // for now it is used to set the initial camera position to be centered on the tracks\n public get extent() {\n const paths = this.tracks_.map((track) => track.path);\n return getPathBoundingBox(paths.flat());\n }\n}\n\ntype BoundingBox3D = {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n zMin: number;\n zMax: number;\n};\n\nfunction getPathBoundingBox(path: vec3[]): BoundingBox3D {\n function getAxisBounds(index: number): [number, number] {\n const values = path.map((point) => point[index]);\n return [Math.min(...values), Math.max(...values)];\n }\n\n const [xMin, xMax] = getAxisBounds(0);\n const [yMin, yMax] = getAxisBounds(1);\n const [zMin, zMax] = getAxisBounds(2);\n\n return { xMin, xMax, yMin, yMax, zMin, zMax };\n}\n\ntype BezierParams = {\n path: vec3[];\n pointsPerSegment: number;\n tangentFactor?: number;\n};\n\nfunction cubicBezierInterpolation({\n path,\n pointsPerSegment,\n tangentFactor = 1.0 / 3.0,\n}: BezierParams): vec3[] {\n const tangents = pathTangents(path);\n\n const out = Array((path.length - 1) * pointsPerSegment);\n\n // a cubic bezier curve is defined by 4 control points: a, b, c, d\n // for interpolation of a segment:\n // * a and d are the endpoints of the curve segment\n // * b and c are control points that define curvature\n // default is 1/3 of the tangent at each endpoint as the control points\n // this is equivalent to a cubic Hermite spline\n for (let i = 0; i < path.length - 1; i++) {\n const a = path[i];\n const d = path[i + 1];\n const b = vec3.clone(tangents[i]);\n vec3.scaleAndAdd(b, a, b, tangentFactor);\n const c = vec3.clone(tangents[i + 1]);\n vec3.scaleAndAdd(c, d, c, -tangentFactor);\n for (let p = 0; p < pointsPerSegment; p++) {\n const t = p / pointsPerSegment;\n const o = (out[i * pointsPerSegment + p] = vec3.create());\n vec3.bezier(o, a, b, c, d, t);\n }\n }\n\n return out;\n}\n\nfunction pathTangents(path: vec3[]): vec3[] {\n if (path.length < 2) {\n throw new Error(\"Path must contain at least 2 points\");\n }\n\n const tangents: vec3[] = Array(path.length);\n const m0 = vec3.create();\n const m1 = vec3.create();\n for (let i = 0; i < path.length; i++) {\n const curr = path[i];\n const next = path[i + 1] ?? path[i];\n\n tangents[i] = vec3.create();\n\n if (i !== 0) {\n vec3.copy(m0, m1);\n }\n\n if (i !== path.length - 1) {\n vec3.sub(m1, next, curr);\n }\n\n if (i === 0) {\n vec3.copy(tangents[i], m1);\n } else if (i == path.length - 1) {\n vec3.copy(tangents[i], m0);\n } else {\n vec3.add(tangents[i], m0, m1);\n vec3.scale(tangents[i], tangents[i], 0.5);\n }\n }\n\n return tangents;\n}\n","import { Geometry } from \"../../core/geometry\";\n\nexport class PlaneGeometry extends Geometry {\n constructor(\n width: number,\n height: number,\n widthSegments: number,\n heightSegments: number\n ) {\n super();\n const vertex: number[] = [];\n const index: number[] = [];\n\n const gridX = widthSegments;\n const gridY = heightSegments;\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segmentW = width / gridX;\n const segmentH = height / gridY;\n\n for (let iy = 0; iy < gridY1; ++iy) {\n const y = iy * segmentH;\n for (let ix = 0; ix < gridX1; ++ix) {\n const x = ix * segmentW;\n const u = ix / gridX;\n const v = iy / gridY;\n\n const position = [x, y, 0];\n const normals = [0, 0, 1];\n const uvs = [u, v];\n\n vertex.push(...position, ...normals, ...uvs);\n }\n }\n\n for (let iy = 0; iy < gridY; ++iy) {\n for (let ix = 0; ix < gridX; ++ix) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = ix + 1 + gridX1 * (iy + 1);\n const d = ix + 1 + gridX1 * iy;\n\n index.push(a, b, d);\n index.push(b, c, d);\n }\n }\n\n this.vertexData_ = new Float32Array(vertex);\n this.indexData_ = new Uint32Array(index);\n\n this.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n\n this.addAttribute({\n type: \"normal\",\n itemSize: 3,\n offset: 3 * Float32Array.BYTES_PER_ELEMENT,\n });\n\n this.addAttribute({\n type: \"uv\",\n itemSize: 2,\n offset: 6 * Float32Array.BYTES_PER_ELEMENT,\n });\n }\n}\n","import { Node } from \"../../core/node\";\n\nexport type TextureFilter = \"nearest\" | \"linear\";\n\nexport type TextureWrapMode = \"repeat\" | \"clamp_to_edge\";\n\nexport type TextureDataFormat = \"scalar\" | \"rgb\" | \"rgba\";\n\nexport type TextureDataType =\n | \"byte\"\n | \"short\"\n | \"int\"\n | \"unsigned_byte\"\n | \"unsigned_short\"\n | \"unsigned_int\"\n | \"float\";\n\nexport type TextureUnpackRowAlignment = 1 | 2 | 4 | 8;\n\nexport type DataTextureTypedArray =\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Float32Array;\n\nexport function isTextureUnpackRowAlignment(\n value: number\n): value is TextureUnpackRowAlignment {\n return value === 1 || value === 2 || value === 4 || value === 8;\n}\n\nexport function bufferToDataType(\n buffer: DataTextureTypedArray\n): TextureDataType {\n if (buffer instanceof Int8Array) {\n return \"byte\";\n } else if (buffer instanceof Int16Array) {\n return \"short\";\n } else if (buffer instanceof Int32Array) {\n return \"int\";\n } else if (buffer instanceof Uint8Array) {\n return \"unsigned_byte\";\n } else if (buffer instanceof Uint16Array) {\n return \"unsigned_short\";\n } else if (buffer instanceof Uint32Array) {\n return \"unsigned_int\";\n } else if (buffer instanceof Float32Array) {\n return \"float\";\n }\n throw new Error(\"Unsupported buffer type.\");\n}\n\nexport function textureDefaultValueRange(texture: Texture): [number, number] {\n if (texture.dataFormat === \"rgb\" || texture.dataFormat === \"rgba\") {\n return [0, 1];\n }\n switch (texture.dataType) {\n case \"byte\":\n return [-128, 127];\n case \"short\":\n return [-32768, 32767];\n case \"int\":\n return [-2147483648, 2147483647];\n case \"unsigned_byte\":\n return [0, 255];\n case \"unsigned_short\":\n return [0, 65535];\n case \"unsigned_int\":\n return [0, 4294967295];\n case \"float\":\n return [0, 1];\n }\n}\n\nexport abstract class Texture extends Node {\n public dataFormat: TextureDataFormat = \"rgba\";\n public dataType: TextureDataType = \"unsigned_byte\";\n public maxFilter: TextureFilter = \"nearest\";\n public minFilter: TextureFilter = \"nearest\";\n public mipmapLevels = 1;\n public unpackAlignment: TextureUnpackRowAlignment = 4;\n public wrapR: TextureWrapMode = \"clamp_to_edge\";\n public wrapS: TextureWrapMode = \"clamp_to_edge\";\n public wrapT: TextureWrapMode = \"clamp_to_edge\";\n public needsUpdate = true;\n\n public abstract get width(): number;\n public abstract get height(): number;\n public abstract get data(): TexImageSource | ArrayBufferView | null;\n public abstract set data(data: DataTextureTypedArray);\n\n public get type() {\n return \"Texture\";\n }\n}\n","// Maximum number of channels supported in multichannel images\nexport const MAX_CHANNELS = 32;\n","// TODO: move this file out of `textures`\nimport { Color, ColorLike } from \"../../core/color\";\nimport {\n Texture,\n textureDefaultValueRange,\n} from \"../../objects/textures/texture\";\nimport { MAX_CHANNELS } from \"../../core/constants\";\nimport { Texture2DArray } from \"./texture_2d_array\";\nimport { Logger } from \"../../utilities/logger\";\n\nexport type Channel = {\n visible: boolean;\n color: Color;\n contrastLimits: [number, number];\n};\n\nexport type ChannelProps = {\n visible?: boolean;\n color?: ColorLike;\n contrastLimits?: [number, number];\n};\n\n/** Layer that exposes channel controls. */\nexport interface ChannelsEnabled {\n channelProps: ChannelProps[] | undefined;\n setChannelProps(channelProps: ChannelProps[]): void;\n resetChannelProps(): void;\n addChannelChangeCallback(callback: () => void): void;\n removeChannelChangeCallback(callback: () => void): void;\n}\n\nexport function validateChannel(\n texture: Texture | null,\n { visible, color, contrastLimits }: ChannelProps\n): Channel {\n if (visible === undefined) {\n visible = true;\n }\n if (color === undefined) {\n color = Color.WHITE;\n } else {\n color = Color.from(color);\n }\n\n if (texture !== null) {\n contrastLimits = validateContrastLimits(contrastLimits, texture);\n } else if (contrastLimits === undefined) {\n Logger.debug(\n \"Channel\",\n \"No texture provided, defaulting channel contrast limits to [0, 1].\"\n );\n contrastLimits = [0, 1];\n }\n return {\n visible,\n color,\n contrastLimits,\n };\n}\n\nexport function validateChannels(\n texture: Texture | null,\n channelProps: ChannelProps[]\n): Channel[] {\n if (channelProps.length > MAX_CHANNELS) {\n throw new Error(`Maximum number of channels is ${MAX_CHANNELS}`);\n }\n\n if (texture?.type === \"Texture2DArray\") {\n const depth = (texture as Texture2DArray).depth;\n if (channelProps.length !== depth) {\n throw new Error(\n `Number of channels (${channelProps.length}) must match depth of texture (${depth}).`\n );\n }\n }\n\n return channelProps.map((props) => validateChannel(texture, props));\n}\n\nfunction validateContrastLimits(\n contrastLimits: [number, number] | undefined,\n texture: Texture\n): [number, number] {\n if (contrastLimits === undefined) {\n return textureDefaultValueRange(texture);\n }\n if (contrastLimits[1] <= contrastLimits[0]) {\n throw new Error(\n `Contrast limits must be strictly increasing: ${contrastLimits}.`\n );\n }\n return contrastLimits;\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { PlaneGeometry } from \"../../objects/geometry/plane_geometry\";\nimport { Texture, TextureDataType } from \"../../objects/textures/texture\";\nimport {\n Channel,\n ChannelProps,\n validateChannel,\n validateChannels,\n} from \"../../objects/textures/channel\";\nimport { vec3 } from \"gl-matrix\";\nimport { Shader } from \"../../renderers/shaders\";\n\ntype SingleUniformValues = {\n ImageSampler: number;\n Color: vec3;\n ValueOffset: number;\n ValueScale: number;\n};\n\ntype ArrayUniformValues = {\n ImageSampler: number;\n \"Visible[0]\": boolean[];\n \"Color[0]\": number[];\n \"ValueOffset[0]\": number[];\n \"ValueScale[0]\": number[];\n};\n\nexport class ImageRenderable extends RenderableObject {\n private channels_: Required<Channel>[];\n\n constructor(\n width: number,\n height: number,\n texture: Texture,\n channels: ChannelProps[] = []\n ) {\n super();\n this.geometry = new PlaneGeometry(width, height, 1, 1);\n this.setTexture(0, texture);\n this.channels_ = validateChannels(texture, channels);\n this.programName = textureToShader(texture);\n }\n\n public get type() {\n return \"ImageRenderable\";\n }\n\n public setChannelProps(channels: ChannelProps[]) {\n this.channels_ = validateChannels(this.textures[0], channels);\n }\n\n public setChannelProperty<K extends keyof ChannelProps>(\n channelIndex: number,\n property: K,\n value: Required<ChannelProps>[K]\n ) {\n const newChannel = validateChannel(this.textures[0], {\n ...this.channels_[channelIndex],\n [property]: value,\n });\n\n this.channels_[channelIndex] = newChannel;\n }\n\n public override getUniforms(): SingleUniformValues | ArrayUniformValues {\n const texture = this.textures[0];\n if (!texture) {\n throw new Error(\"No texture set\");\n }\n\n if (texture.type === \"Texture2D\") {\n const { color, contrastLimits } =\n this.channels_[0] ?? validateChannel(texture, {});\n return {\n ImageSampler: 0,\n Color: color.rgb,\n ValueOffset: -contrastLimits[0],\n ValueScale: 1 / (contrastLimits[1] - contrastLimits[0]),\n };\n } else {\n // Texture2DArray case\n const visible: boolean[] = [];\n const color: number[] = [];\n const valueOffset: number[] = [];\n const valueScale: number[] = [];\n\n // All channels (including defaults) are already in this.channels_\n this.channels_.forEach((channel) => {\n visible.push(channel.visible);\n color.push(...channel.color.rgb);\n valueOffset.push(-channel.contrastLimits[0]);\n valueScale.push(\n 1 / (channel.contrastLimits[1] - channel.contrastLimits[0])\n );\n });\n\n return {\n ImageSampler: 0,\n \"Visible[0]\": visible,\n \"Color[0]\": color,\n \"ValueOffset[0]\": valueOffset,\n \"ValueScale[0]\": valueScale,\n };\n }\n }\n}\n\nfunction textureToShader(texture: Texture) {\n if (texture.type === \"Texture2D\") {\n return dataTypeToScalarImageShader(texture.dataType);\n } else if (texture.type === \"Texture2DArray\") {\n return dataTypeToArrayImageShader(texture.dataType);\n }\n throw new Error(`Unsupported image texture type: ${texture.type}`);\n}\n\nfunction dataTypeToScalarImageShader(dataType: TextureDataType): Shader {\n switch (dataType) {\n case \"byte\":\n case \"int\":\n case \"short\":\n return \"intScalarImage\";\n case \"unsigned_short\":\n case \"unsigned_byte\":\n case \"unsigned_int\":\n return \"uintScalarImage\";\n case \"float\":\n return \"floatScalarImage\";\n }\n}\n\nfunction dataTypeToArrayImageShader(dataType: TextureDataType): Shader {\n switch (dataType) {\n case \"byte\":\n case \"int\":\n case \"short\":\n return \"intScalarImageArray\";\n case \"unsigned_short\":\n case \"unsigned_byte\":\n case \"unsigned_int\":\n return \"uintScalarImageArray\";\n case \"float\":\n return \"floatScalarImageArray\";\n }\n}\n","import {\n DataTextureTypedArray,\n Texture,\n bufferToDataType,\n} from \"../../objects/textures/texture\";\n\nimport { Chunk, ChunkData } from \"../../data/chunk\";\nexport class Texture2DArray extends Texture {\n private data_: DataTextureTypedArray;\n private readonly width_: number;\n private readonly height_: number;\n private readonly depth_: number;\n\n constructor(data: DataTextureTypedArray, width: number, height: number) {\n super();\n this.dataFormat = \"scalar\";\n this.dataType = bufferToDataType(data);\n\n this.data_ = data;\n this.width_ = width;\n this.height_ = height;\n // We currently assume that each slice's size is equal to the image's area\n this.depth_ = data.length / (width * height);\n }\n\n public get type() {\n return \"Texture2DArray\";\n }\n\n public set data(data: DataTextureTypedArray) {\n this.data_ = data;\n this.needsUpdate = true;\n }\n\n public get data() {\n return this.data_;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public get depth() {\n return this.depth_;\n }\n\n public updateWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to update texture, chunk data is not initialized.\"\n );\n }\n\n if (this.data === source) return;\n\n const width = chunk.shape.x;\n const height = chunk.shape.y;\n const depth = source.length / (width * height);\n if (\n this.width != width ||\n this.height != height ||\n this.depth_ != depth ||\n this.dataType != bufferToDataType(source)\n ) {\n throw new Error(\"Unable to update texture, texture buffer mismatch.\");\n }\n\n this.data = source;\n }\n\n public static createWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to create texture, chunk data is not initialized.\"\n );\n }\n const texture = new Texture2DArray(source, chunk.shape.x, chunk.shape.y);\n texture.unpackAlignment = chunk.rowAlignmentBytes;\n return texture;\n }\n}\n","import { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\n\nexport interface PointPickingResult {\n world: vec3;\n value: number;\n}\n\nexport function handlePointPickingEvent<T>(\n event: EventContext,\n pointerDownPos: vec2 | null,\n getValueAtWorld: (world: vec3) => T | null,\n onPickValue?: (info: { world: vec3; value: T }) => void,\n dragThreshold: number = 3\n): vec2 | null {\n switch (event.type) {\n case \"pointerdown\": {\n const e = event.event as PointerEvent;\n return vec2.fromValues(e.clientX, e.clientY);\n }\n\n case \"pointerup\": {\n if (!pointerDownPos) return pointerDownPos;\n\n const e = event.event as PointerEvent;\n const pointerUpPos = vec2.fromValues(e.clientX, e.clientY);\n const dist = vec2.distance(pointerDownPos, pointerUpPos);\n\n if (dist < dragThreshold) {\n if (!onPickValue) return null;\n\n const world = event.worldPos;\n if (world) {\n const value = getValueAtWorld(world);\n if (value !== null) {\n onPickValue({ world, value });\n }\n }\n return null;\n }\n return pointerDownPos;\n }\n\n case \"pointercancel\": {\n return null;\n }\n\n default:\n return pointerDownPos;\n }\n}\n","import { RenderableObject } from \"../core/renderable_object\";\nimport { Logger } from \"./logger\";\n\nexport class RenderablePool<T extends RenderableObject> {\n private readonly bins_ = new Map<string, T[]>();\n\n acquire(key: string) {\n const bin = this.bins_.get(key);\n const item = bin?.pop();\n if (item) {\n Logger.debug(\"RenderablePool\", \"Renderable object acquired\");\n }\n return item;\n }\n\n release(key: string, item: T) {\n let bin = this.bins_.get(key);\n if (!bin) {\n bin = [];\n this.bins_.set(key, bin);\n }\n bin.push(item);\n Logger.debug(\"RenderablePool\", \"Renderable object released\");\n }\n\n clearAll(disposer?: (t: T) => void) {\n if (disposer) for (const bin of this.bins_.values()) bin.forEach(disposer);\n this.bins_.clear();\n }\n}\n","import { Layer, LayerOptions, RenderContext } from \"../core/layer\";\nimport type { IdetikContext } from \"../idetik\";\nimport { Chunk, ChunkSource, SliceCoordinates } from \"../data/chunk\";\nimport { ChunkStoreView, INTERNAL_POLICY_KEY } from \"../core/chunk_store_view\";\nimport { ImageSourcePolicy } from \"../core/image_source_policy\";\nimport { ChannelProps, ChannelsEnabled } from \"../objects/textures/channel\";\nimport { ImageRenderable } from \"../objects/renderable/image_renderable\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { Logger } from \"../utilities/logger\";\nimport { Color } from \"../core/color\";\nimport { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { handlePointPickingEvent, PointPickingResult } from \"./point_picking\";\nimport { almostEqual } from \"../utilities/almost_equal\";\nimport { clamp } from \"../utilities/clamp\";\nimport { RenderablePool } from \"../utilities/renderable_pool\";\n\nexport type ChunkedImageLayerProps = LayerOptions & {\n source: ChunkSource;\n sliceCoords: SliceCoordinates;\n policy: ImageSourcePolicy;\n channelProps?: ChannelProps[];\n onPickValue?: (info: PointPickingResult) => void;\n};\n\nexport class ChunkedImageLayer extends Layer implements ChannelsEnabled {\n public readonly type = \"ChunkedImageLayer\";\n\n private readonly source_: ChunkSource;\n private readonly sliceCoords_: SliceCoordinates;\n private readonly onPickValue_?: (info: PointPickingResult) => void;\n private readonly visibleChunks_: Map<Chunk, ImageRenderable> = new Map();\n private readonly pool_ = new RenderablePool<ImageRenderable>();\n private readonly initialChannelProps_?: ChannelProps[];\n private readonly channelChangeCallbacks_: (() => void)[] = [];\n private policy_: ImageSourcePolicy;\n private channelProps_?: ChannelProps[];\n private chunkStoreView_?: ChunkStoreView;\n private pointerDownPos_: vec2 | null = null;\n private zPrevPointWorld_?: number;\n private debugMode_ = false;\n\n private static readonly STALE_PRESENTATION_MS_ = 1000;\n private lastPresentationTimeStamp_?: DOMHighResTimeStamp;\n private lastPresentationTimeCoord_?: number;\n\n private readonly wireframeColors_ = [\n new Color(0.6, 0.3, 0.3),\n new Color(0.3, 0.6, 0.4),\n new Color(0.4, 0.4, 0.7),\n new Color(0.6, 0.5, 0.3),\n ];\n\n constructor({\n source,\n sliceCoords,\n policy,\n channelProps,\n onPickValue,\n ...layerOptions\n }: ChunkedImageLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.source_ = source;\n this.policy_ = policy;\n this.sliceCoords_ = sliceCoords;\n this.channelProps_ = channelProps;\n this.initialChannelProps_ = channelProps;\n this.onPickValue_ = onPickValue;\n }\n\n public async onAttached(context: IdetikContext) {\n if (this.chunkStoreView_) {\n throw new Error(\n \"ChunkedImageLayer cannot be attached to multiple contexts simultaneously.\"\n );\n }\n this.chunkStoreView_ = await context.chunkManager.addView(\n this.source_,\n this.policy_\n );\n }\n\n public onDetached(context: IdetikContext): void {\n this.releaseAndRemoveChunks(this.visibleChunks_.keys());\n this.clearObjects();\n if (!this.chunkStoreView_) return;\n context.chunkManager.removeView(this.chunkStoreView_);\n this.chunkStoreView_ = undefined;\n }\n\n public update(context?: RenderContext) {\n if (!context || !this.chunkStoreView_) return;\n\n this.chunkStoreView_.updateChunkStates(this.sliceCoords_, context.viewport);\n\n this.updateChunks();\n this.resliceIfZChanged();\n }\n\n private updateChunks() {\n if (!this.chunkStoreView_) return;\n if (this.state !== \"ready\") this.setState(\"ready\");\n\n if (\n this.visibleChunks_.size > 0 &&\n !this.chunkStoreView_.allVisibleLowestLODLoaded(this.sliceCoords_) &&\n !this.isPresentationStale()\n ) {\n return;\n }\n this.lastPresentationTimeStamp_ = performance.now();\n this.lastPresentationTimeCoord_ = this.sliceCoords_.t;\n\n const orderedByLOD = this.chunkStoreView_.getChunksToRender(\n this.sliceCoords_\n );\n const current = new Set(orderedByLOD);\n const nonVisibleChunks = Array.from(this.visibleChunks_.keys()).filter(\n (chunk) => !current.has(chunk)\n );\n this.releaseAndRemoveChunks(nonVisibleChunks);\n\n this.clearObjects();\n for (const chunk of orderedByLOD) {\n if (chunk.state !== \"loaded\") continue;\n const image = this.getImageForChunk(chunk);\n this.visibleChunks_.set(chunk, image);\n this.addObject(image);\n }\n }\n\n public get lastPresentationTimeCoord(): number | undefined {\n return this.lastPresentationTimeCoord_;\n }\n\n private isPresentationStale(): boolean {\n if (this.lastPresentationTimeStamp_ === undefined) return false;\n return (\n performance.now() - this.lastPresentationTimeStamp_ >\n ChunkedImageLayer.STALE_PRESENTATION_MS_\n );\n }\n\n private resliceIfZChanged() {\n const zPointWorld = this.sliceCoords_.z;\n if (zPointWorld === undefined || this.zPrevPointWorld_ === zPointWorld) {\n return;\n }\n\n for (const [chunk, image] of this.visibleChunks_) {\n if (chunk.state !== \"loaded\" || !chunk.data) continue;\n const data = this.slicePlane(chunk, zPointWorld);\n if (data) {\n const texture = image.textures[0] as Texture2DArray;\n texture.updateWithChunk(chunk, data);\n }\n }\n\n this.zPrevPointWorld_ = zPointWorld;\n }\n\n public onEvent(event: EventContext) {\n this.pointerDownPos_ = handlePointPickingEvent(\n event,\n this.pointerDownPos_,\n (world) => this.getValueAtWorld(world),\n this.onPickValue_\n );\n }\n\n // exposed for use in chunk info overlay\n public get chunkStoreView(): ChunkStoreView | undefined {\n return this.chunkStoreView_;\n }\n\n public get sliceCoords(): SliceCoordinates {\n return this.sliceCoords_;\n }\n\n public get source(): ChunkSource {\n return this.source_;\n }\n\n public get imageSourcePolicy(): Readonly<ImageSourcePolicy> {\n return this.policy_;\n }\n\n public set imageSourcePolicy(newPolicy: ImageSourcePolicy) {\n if (this.policy_ !== newPolicy) {\n this.policy_ = newPolicy;\n if (this.chunkStoreView_) {\n this.chunkStoreView_.setImageSourcePolicy(\n newPolicy,\n INTERNAL_POLICY_KEY\n );\n }\n }\n }\n\n private slicePlane(chunk: Chunk, zValue: number) {\n if (!chunk.data) return;\n const zLocal = (zValue - chunk.offset.z) / chunk.scale.z;\n const zIdx = Math.round(zLocal);\n const zClamped = clamp(zIdx, 0, chunk.shape.z - 1);\n\n // Treat values within ~1 voxel (plus tiny floating-point error) as OK.\n // Anything further away means the requested zValue is outside.\n if (!almostEqual(zLocal, zClamped, 1 + 1e-6)) {\n Logger.error(\"ImageLayer\", \"slicePlane zValue outside extent\");\n }\n\n const sliceSize = chunk.shape.x * chunk.shape.y;\n const offset = sliceSize * zClamped;\n return chunk.data.slice(offset, offset + sliceSize);\n }\n\n private getImageForChunk(chunk: Chunk) {\n const existing = this.visibleChunks_.get(chunk);\n if (existing) return existing;\n\n const pooled = this.pool_.acquire(poolKeyForImageRenderable(chunk));\n if (pooled) {\n const texture = pooled.textures[0] as Texture2DArray;\n texture.updateWithChunk(chunk, this.getDataForImage(chunk));\n this.updateImageChunk(pooled, chunk);\n if (this.channelProps_) {\n pooled.setChannelProps(this.channelProps_);\n }\n return pooled;\n }\n\n return this.createImage(chunk);\n }\n\n private createImage(chunk: Chunk) {\n const image = new ImageRenderable(\n chunk.shape.x,\n chunk.shape.y,\n Texture2DArray.createWithChunk(chunk, this.getDataForImage(chunk)),\n this.channelProps_ ?? [{}]\n );\n this.updateImageChunk(image, chunk);\n return image;\n }\n\n private getDataForImage(chunk: Chunk) {\n const data =\n this.sliceCoords_?.z !== undefined\n ? this.slicePlane(chunk, this.sliceCoords_.z)\n : chunk.data;\n if (!data) {\n Logger.warn(\"ChunkedImageLayer\", \"No data for image\");\n return;\n }\n return data;\n }\n\n private updateImageChunk(image: ImageRenderable, chunk: Chunk) {\n if (this.debugMode_) {\n image.wireframeEnabled = true;\n image.wireframeColor =\n this.wireframeColors_[chunk.lod % this.wireframeColors_.length];\n } else {\n image.wireframeEnabled = false;\n }\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n }\n\n public getValueAtWorld(world: vec3): number | null {\n const currentLOD = this.chunkStoreView_?.currentLOD ?? 0;\n\n // First, try to find the value in current LOD chunks (highest priority)\n for (const [chunk, image] of this.visibleChunks_) {\n if (chunk.lod !== currentLOD) continue;\n const value = this.getValueFromChunk(chunk, image, world);\n if (value !== null) return value;\n }\n\n // Fallback to low-res chunks if no current LOD chunk contains the position\n for (const [chunk, image] of this.visibleChunks_) {\n if (chunk.lod === currentLOD) continue;\n const value = this.getValueFromChunk(chunk, image, world);\n if (value !== null) return value;\n }\n\n return null;\n }\n\n private getValueFromChunk(\n chunk: Chunk,\n image: ImageRenderable,\n world: vec3\n ): number | null {\n if (!chunk.data) return null;\n\n const localPos = vec3.transformMat4(\n vec3.create(),\n world,\n image.transform.inverse\n );\n\n const x = Math.floor(localPos[0]);\n const y = Math.floor(localPos[1]);\n\n // Check if this chunk contains the requested position\n if (x >= 0 && x < chunk.shape.x && y >= 0 && y < chunk.shape.y) {\n const data =\n this.sliceCoords_.z !== undefined\n ? this.slicePlane(chunk, this.sliceCoords_.z)!\n : chunk.data;\n const pixelIndex = y * chunk.shape.x + x;\n\n // For multi-channel images, take the first channel value\n return data[pixelIndex];\n }\n\n return null;\n }\n\n public get debugMode(): boolean {\n return this.debugMode_;\n }\n\n public set debugMode(debug: boolean) {\n this.debugMode_ = debug;\n this.visibleChunks_.forEach((image, chunk) => {\n image.wireframeEnabled = this.debugMode_;\n if (this.debugMode_) {\n image.wireframeColor =\n this.wireframeColors_[chunk.lod % this.wireframeColors_.length];\n }\n });\n }\n\n public get channelProps(): ChannelProps[] | undefined {\n return this.channelProps_;\n }\n\n public setChannelProps(channelProps: ChannelProps[]) {\n this.channelProps_ = channelProps;\n this.visibleChunks_.forEach((image) => {\n image.setChannelProps(channelProps);\n });\n this.channelChangeCallbacks_.forEach((callback) => {\n callback();\n });\n }\n\n public resetChannelProps(): void {\n if (this.initialChannelProps_ !== undefined) {\n this.setChannelProps(this.initialChannelProps_);\n }\n }\n\n public addChannelChangeCallback(callback: () => void): void {\n this.channelChangeCallbacks_.push(callback);\n }\n\n public removeChannelChangeCallback(callback: () => void): void {\n const index = this.channelChangeCallbacks_.indexOf(callback);\n if (index === -1) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.channelChangeCallbacks_.splice(index, 1);\n }\n\n private releaseAndRemoveChunks(chunks: Iterable<Chunk>): void {\n for (const chunk of chunks) {\n const image = this.visibleChunks_.get(chunk);\n if (image) {\n this.pool_.release(poolKeyForImageRenderable(chunk), image);\n this.visibleChunks_.delete(chunk);\n }\n }\n }\n}\n\nexport function poolKeyForImageRenderable(chunk: Chunk) {\n return [\n `lod${chunk.lod}`,\n `shape${chunk.shape.x}x${chunk.shape.y}`,\n `align${chunk.rowAlignmentBytes}`,\n ].join(\":\");\n}\n","import { DataTextureTypedArray, Texture, bufferToDataType } from \"./texture\";\nimport { Chunk } from \"../../data/chunk\";\n\nexport class Texture3D extends Texture {\n private data_: DataTextureTypedArray;\n private readonly width_: number;\n private readonly height_: number;\n private readonly depth_: number;\n\n constructor(\n data: DataTextureTypedArray,\n width: number,\n height: number,\n depth: number\n ) {\n super();\n this.dataFormat = \"scalar\";\n this.dataType = bufferToDataType(data);\n\n this.data_ = data;\n this.width_ = width;\n this.height_ = height;\n this.depth_ = depth;\n }\n\n public set data(data: DataTextureTypedArray) {\n this.data_ = data;\n this.needsUpdate = true;\n }\n\n public get type() {\n return \"Texture3D\";\n }\n\n public get data() {\n return this.data_;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public get depth() {\n return this.depth_;\n }\n\n public updateWithChunk(chunk: Chunk) {\n const source = chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to update texture, chunk data is not initialized.\"\n );\n }\n\n if (this.data === source) return;\n\n if (\n this.width != chunk.shape.x ||\n this.height != chunk.shape.y ||\n this.depth != chunk.shape.z ||\n this.dataType != bufferToDataType(source)\n ) {\n throw new Error(\"Unable to update texture, texture buffer mismatch.\");\n }\n\n this.data = source;\n }\n\n public static createWithChunk(chunk: Chunk) {\n const source = chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to create texture, chunk data is not initialized.\"\n );\n }\n\n const texture = new Texture3D(\n source,\n chunk.shape.x,\n chunk.shape.y,\n chunk.shape.z\n );\n texture.unpackAlignment = chunk.rowAlignmentBytes;\n return texture;\n }\n}\n","import { Geometry } from \"../../core/geometry\";\n\ntype Axis = \"x\" | \"y\" | \"z\";\ntype Vec3Obj = Record<Axis, number>;\n\nexport class BoxGeometry extends Geometry {\n constructor(\n width: number,\n height: number,\n depth: number,\n widthSegments: number,\n heightSegments: number,\n depthSegments: number\n ) {\n super();\n\n const vertex: number[] = [];\n const index: number[] = [];\n\n const wSeg = Math.floor(widthSegments);\n const hSeg = Math.floor(heightSegments);\n const dSeg = Math.floor(depthSegments);\n\n // prettier-ignore\n {\n this.buildFace(\"z\", \"y\", \"x\", -1, -1, depth, height, width, dSeg, hSeg, +1, vertex, index); // +X\n this.buildFace(\"z\", \"y\", \"x\", +1, -1, depth, height, width, dSeg, hSeg, -1, vertex, index); // -X\n this.buildFace(\"x\", \"z\", \"y\", +1, +1, width, depth, height, wSeg, dSeg, +1, vertex, index); // +Y\n this.buildFace(\"x\", \"z\", \"y\", +1, -1, width, depth, height, wSeg, dSeg, -1, vertex, index); // -Y\n this.buildFace(\"x\", \"y\", \"z\", +1, -1, width, height, depth, wSeg, hSeg, +1, vertex, index); // +Z\n this.buildFace(\"x\", \"y\", \"z\", -1, -1, width, height, depth, wSeg, hSeg, -1, vertex, index); // -Z\n }\n\n this.vertexData_ = new Float32Array(vertex);\n this.indexData_ = new Uint32Array(index);\n\n this.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n\n this.addAttribute({\n type: \"normal\",\n itemSize: 3,\n offset: 3 * Float32Array.BYTES_PER_ELEMENT,\n });\n\n this.addAttribute({\n type: \"uv\",\n itemSize: 2,\n offset: 6 * Float32Array.BYTES_PER_ELEMENT,\n });\n }\n\n private buildFace(\n axisU: Axis,\n axisV: Axis,\n axisW: Axis,\n udir: number,\n vdir: number,\n faceWidth: number,\n faceHeight: number,\n faceDepth: number,\n gridX: number,\n gridY: number,\n wdir: number,\n vertex: number[],\n index: number[]\n ) {\n const segmentWidth = faceWidth / gridX;\n const segmentHeight = faceHeight / gridY;\n\n const widthHalf = faceWidth / 2;\n const heightHalf = faceHeight / 2;\n const depthHalf = (faceDepth / 2) * wdir;\n\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n\n const vertexPosition = vertex.length / 8;\n\n for (let iy = 0; iy < gridY1; iy++) {\n const vy = -heightHalf + iy * segmentHeight;\n for (let ix = 0; ix < gridX1; ix++) {\n const vx = -widthHalf + ix * segmentWidth;\n\n const position: Vec3Obj = { x: 0, y: 0, z: 0 };\n position[axisU] = vx * udir;\n position[axisV] = vy * vdir;\n position[axisW] = depthHalf;\n\n const normal: Vec3Obj = { x: 0, y: 0, z: 0 };\n normal[axisW] = wdir;\n\n const u = ix / gridX;\n const v = 1 - iy / gridY;\n\n vertex.push(\n position.x,\n position.y,\n position.z,\n normal.x,\n normal.y,\n normal.z,\n u,\n v\n );\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = vertexPosition + ix + gridX1 * iy;\n const b = vertexPosition + ix + gridX1 * (iy + 1);\n const c = vertexPosition + (ix + 1) + gridX1 * (iy + 1);\n const d = vertexPosition + (ix + 1) + gridX1 * iy;\n if (wdir === 1) {\n index.push(a, b, d, b, c, d);\n } else {\n index.push(a, d, b, b, d, c);\n }\n }\n }\n }\n}\n","import { Shader } from \"../../renderers/shaders\";\nimport { RenderableObject } from \"../../core/renderable_object\";\nimport { BoxGeometry } from \"../geometry/box_geometry\";\nimport { TextureDataType } from \"../textures/texture\";\nimport { Texture3D } from \"../textures/texture_3d\";\n\nexport class VolumeRenderable extends RenderableObject {\n constructor(\n width: number,\n height: number,\n depth: number,\n texture: Texture3D\n ) {\n super();\n this.geometry = new BoxGeometry(width, height, depth, 1, 1, 1);\n this.cullFaceMode = \"back\";\n this.setTexture(0, texture);\n this.programName = dataTypeToVolumeShader(texture.dataType);\n }\n\n public get type() {\n return \"VolumeRenderable\";\n }\n}\n\nfunction dataTypeToVolumeShader(dataType: TextureDataType): Shader {\n switch (dataType) {\n case \"byte\":\n case \"int\":\n case \"short\":\n return \"intVolume\";\n case \"unsigned_short\":\n case \"unsigned_byte\":\n case \"unsigned_int\":\n return \"uintVolume\";\n case \"float\":\n return \"floatVolume\";\n }\n}\n","import { Layer } from \"../core/layer\";\nimport { Texture3D } from \"../objects/textures/texture_3d\";\nimport { VolumeRenderable } from \"../objects/renderable/volume_renderable\";\n\nexport class VolumeLayer extends Layer {\n public readonly type = \"VolumeLayer\";\n\n constructor() {\n super();\n\n const data = new Int8Array([127, 0, 0, 127, 127, 0, 0, 127]);\n const texture = new Texture3D(data, 2, 2, 2);\n texture.unpackAlignment = 1;\n const renderable = new VolumeRenderable(1, 1, 1, texture);\n renderable.wireframeEnabled = true;\n\n this.addObject(renderable);\n this.setState(\"ready\");\n }\n\n public update() {\n // TODO: implement\n }\n}\n","import { Layer, LayerOptions } from \"../core/layer\";\nimport { Region } from \"../data/region\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { ChannelProps, ChannelsEnabled } from \"../objects/textures/channel\";\nimport { ImageRenderable } from \"../objects/renderable/image_renderable\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { handlePointPickingEvent, PointPickingResult } from \"./point_picking\";\n\nexport type ImageLayerProps = LayerOptions & {\n source: ChunkSource;\n region: Region;\n channelProps?: ChannelProps[];\n onPickValue?: (info: PointPickingResult) => void;\n lod?: number;\n};\n\nexport class ImageLayer extends Layer implements ChannelsEnabled {\n public readonly type = \"ImageLayer\";\n\n private readonly source_: ChunkSource;\n private readonly region_: Region;\n private readonly lod_?: number;\n private readonly onPickValue_?: (info: PointPickingResult) => void;\n private readonly initialChannelProps_?: ChannelProps[];\n private readonly channelChangeCallbacks_: Array<() => void> = [];\n private channelProps_?: ChannelProps[];\n private image_?: ImageRenderable;\n private chunk_?: Chunk;\n private extent_?: { x: number; y: number };\n private pointerDownPos_: vec2 | null = null;\n\n constructor({\n source,\n region,\n channelProps,\n onPickValue,\n lod,\n ...layerOptions\n }: ImageLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.source_ = source;\n this.region_ = region;\n this.channelProps_ = channelProps;\n this.initialChannelProps_ = channelProps;\n this.onPickValue_ = onPickValue;\n this.lod_ = lod;\n }\n\n public update() {\n switch (this.state) {\n case \"initialized\":\n this.load(this.region_);\n break;\n case \"loading\":\n case \"ready\":\n break;\n default: {\n const exhaustiveCheck: never = this.state;\n throw new Error(`Unhandled LayerState case: ${exhaustiveCheck}`);\n }\n }\n }\n\n public onEvent(event: EventContext) {\n this.pointerDownPos_ = handlePointPickingEvent(\n event,\n this.pointerDownPos_,\n (world) => this.getValueAtWorld(world),\n this.onPickValue_\n );\n }\n\n public get channelProps(): ChannelProps[] | undefined {\n // TODO: should this return Channel[] instead of ChannelProps[]?\n return this.channelProps_;\n }\n\n public setChannelProps(channelProps: ChannelProps[]) {\n this.channelProps_ = channelProps;\n this.image_?.setChannelProps(channelProps);\n this.channelChangeCallbacks_.forEach((callback) => {\n callback();\n });\n }\n\n public resetChannelProps(): void {\n if (this.initialChannelProps_ !== undefined) {\n this.setChannelProps(this.initialChannelProps_);\n }\n }\n\n public addChannelChangeCallback(callback: () => void): void {\n this.channelChangeCallbacks_.push(callback);\n }\n\n public removeChannelChangeCallback(callback: () => void): void {\n const index = this.channelChangeCallbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.channelChangeCallbacks_.splice(index, 1);\n }\n\n private async load(region: Region) {\n if (this.state !== \"initialized\") {\n throw new Error(`Trying to load chunks more than once.`);\n }\n this.setState(\"loading\");\n const loader = await this.source_.open();\n const attributes = loader.getAttributes();\n const lod = this.lod_ ?? attributes.length - 1;\n\n const chunk = await loader.loadRegion(region, lod);\n this.extent_ = {\n x: chunk.shape.x * chunk.scale.x,\n y: chunk.shape.y * chunk.scale.y,\n };\n\n this.image_ = this.createImage(chunk);\n this.chunk_ = chunk;\n this.addObject(this.image_);\n\n this.setState(\"ready\");\n }\n\n // TODO: we probably want something like this, but it should be unified across layers\n // see TracksLayer for another example\n public get extent(): { x: number; y: number } | undefined {\n return this.extent_;\n }\n\n private createImage(chunk: Chunk) {\n const image = new ImageRenderable(\n chunk.shape.x,\n chunk.shape.y,\n Texture2DArray.createWithChunk(chunk),\n this.channelProps\n );\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n return image;\n }\n\n public getValueAtWorld(world: vec3): number | null {\n if (!this.image_) return null;\n if (!this.chunk_?.data) return null;\n const localPos = vec3.transformMat4(\n vec3.create(),\n world,\n this.image_.transform.inverse\n );\n\n const x = Math.floor(localPos[0]);\n const y = Math.floor(localPos[1]);\n\n // Check if this chunk contains the requested position\n if (\n x >= 0 &&\n x < this.chunk_.shape.x &&\n y >= 0 &&\n y < this.chunk_.shape.y\n ) {\n const pixelIndex = y * this.chunk_.shape.x + x;\n // For multi-channel images, take the first channel value\n return this.chunk_.data[pixelIndex];\n }\n\n return null;\n }\n}\n","import {\n DataTextureTypedArray,\n Texture,\n bufferToDataType,\n} from \"../../objects/textures/texture\";\nimport { Chunk, ChunkData } from \"../../data/chunk\";\n\nexport class Texture2D extends Texture {\n private data_: DataTextureTypedArray;\n private readonly width_: number;\n private readonly height_: number;\n\n constructor(data: DataTextureTypedArray, width: number, height: number) {\n super();\n this.dataFormat = \"scalar\";\n this.dataType = bufferToDataType(data);\n\n this.data_ = data;\n this.width_ = width;\n this.height_ = height;\n }\n\n public set data(data: DataTextureTypedArray) {\n this.data_ = data;\n this.needsUpdate = true;\n }\n\n public get type() {\n return \"Texture2D\";\n }\n\n public get data() {\n return this.data_;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public updateWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to update texture, chunk data is not initialized.\"\n );\n }\n\n if (this.data === source) return;\n\n if (\n this.width != chunk.shape.x ||\n this.height != chunk.shape.y ||\n this.dataType != bufferToDataType(source)\n ) {\n throw new Error(\"Unable to update texture, texture buffer mismatch.\");\n }\n\n this.data = source;\n }\n\n public static createWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to create texture, chunk data is not initialized.\"\n );\n }\n\n const texture = new Texture2D(source, chunk.shape.x, chunk.shape.y);\n texture.unpackAlignment = chunk.rowAlignmentBytes;\n return texture;\n }\n}\n","import { Color, ColorLike } from \"../../core/color\";\n\nconst defaultColorCycle: ColorLike[] = [\n [1.0, 0.5, 0.5],\n [0.5, 1.0, 0.5],\n [0.5, 0.5, 1.0],\n [0.5, 1.0, 1.0],\n [1.0, 0.5, 1.0],\n [1.0, 1.0, 0.5],\n];\n\nfunction validateLookupTable(\n lookupTable?: ReadonlyMap<number, ColorLike>\n): ReadonlyMap<number, Color> {\n lookupTable = lookupTable ?? new Map();\n return new Map(\n Array.from(lookupTable.entries()).map(([key, value]) => [\n key,\n Color.from(value),\n ])\n );\n}\n\nfunction validateCycle(cycle?: ReadonlyArray<ColorLike>): ReadonlyArray<Color> {\n cycle = cycle ?? defaultColorCycle;\n return cycle.map(Color.from);\n}\n\nexport type LabelColorMapProps = {\n lookupTable?: ReadonlyMap<number, ColorLike>;\n cycle?: ColorLike[];\n};\n\nexport class LabelColorMap {\n public readonly lookupTable: ReadonlyMap<number, Color>;\n public readonly cycle: ReadonlyArray<Color>;\n\n constructor(props: LabelColorMapProps = {}) {\n this.lookupTable = validateLookupTable(props.lookupTable);\n this.cycle = validateCycle(props.cycle);\n }\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { PlaneGeometry } from \"../../objects/geometry/plane_geometry\";\nimport { Texture, TextureDataType } from \"../../objects/textures/texture\";\nimport { Color } from \"../../core/color\";\nimport { Texture2D } from \"../textures/texture_2d\";\nimport { LabelColorMap } from \"./label_color_map\";\n\ntype LabelImageRenderableProps = {\n width: number;\n height: number;\n imageData: Texture;\n colorMap: LabelColorMap;\n outlineSelected?: boolean;\n selectedValue?: number | null;\n};\n\nconst supportedDataTypes = new Set<TextureDataType>([\n \"unsigned_byte\",\n \"unsigned_short\",\n \"unsigned_int\",\n]);\n\nfunction validateImageData(imageData: Texture) {\n if (imageData.dataFormat !== \"scalar\") {\n throw new Error(\n `Image data format must be scalar, instead found: ${imageData.dataFormat}`\n );\n }\n if (!supportedDataTypes.has(imageData.dataType)) {\n throw new Error(\n `Image data type must be unsigned, instead found: ${imageData.dataType}`\n );\n }\n return imageData;\n}\n\nexport class LabelImageRenderable extends RenderableObject {\n private outlineSelected_: boolean;\n private selectedValue_: number | null;\n\n constructor(props: LabelImageRenderableProps) {\n super();\n this.geometry = new PlaneGeometry(props.width, props.height, 1, 1);\n this.setTexture(0, validateImageData(props.imageData));\n const colorCycleTexture = this.makeColorCycleTexture(props.colorMap.cycle);\n this.setTexture(1, colorCycleTexture);\n const colorLookupTableTexture = this.makeColorLookupTableTexture(\n props.colorMap.lookupTable\n );\n this.setTexture(2, colorLookupTableTexture);\n this.outlineSelected_ = props.outlineSelected ?? false;\n this.selectedValue_ = props.selectedValue ?? null;\n this.programName = \"labelImage\";\n }\n\n public get type() {\n return \"LabelImageRenderable\";\n }\n\n public getUniforms() {\n return {\n ImageSampler: 0,\n ColorCycleSampler: 1,\n ColorLookupTableSampler: 2,\n u_outlineSelected: this.outlineSelected_ ? 1.0 : 0.0,\n u_selectedValue: this.selectedValue_ ?? -1.0,\n };\n }\n\n public setColorMap(colorMap: LabelColorMap) {\n this.setTexture(1, this.makeColorCycleTexture(colorMap.cycle));\n this.setTexture(2, this.makeColorLookupTableTexture(colorMap.lookupTable));\n }\n\n public setSelectedValue(value: number | null) {\n this.selectedValue_ = value;\n }\n\n private makeColorCycleTexture(cycle: ReadonlyArray<Color>) {\n const data = new Uint8Array(\n cycle.flatMap((c) => c.rgba).map((v) => Math.round(v * 255))\n );\n const texture = new Texture2D(data, cycle.length, 1);\n texture.dataFormat = \"rgba\";\n return texture;\n }\n\n private makeColorLookupTableTexture(\n lookupTable?: ReadonlyMap<number, Color>\n ) {\n if (lookupTable === undefined) {\n lookupTable = new Map([[0, Color.TRANSPARENT]]);\n } else if (!lookupTable.has(0)) {\n lookupTable = new Map([[0, Color.TRANSPARENT], ...lookupTable]);\n }\n const keys = Array.from(lookupTable.keys());\n const values = Array.from(lookupTable.values()).map((c) => c.packed);\n const numColors = lookupTable.size;\n const data = new Uint32Array(numColors * 2);\n data.set(keys, 0);\n data.set(values, numColors);\n return new Texture2D(data, numColors, 2);\n }\n}\n","import { Layer, LayerOptions } from \"../core/layer\";\nimport { Region } from \"../data/region\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { Texture2D } from \"../objects/textures/texture_2d\";\nimport {\n LabelColorMap,\n LabelColorMapProps,\n} from \"../objects/renderable/label_color_map\";\nimport { LabelImageRenderable } from \"../objects/renderable/label_image_renderable\";\nimport { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { handlePointPickingEvent, PointPickingResult } from \"./point_picking\";\n\nexport type LabelImageLayerProps = LayerOptions & {\n source: ChunkSource;\n region: Region;\n colorMap?: LabelColorMapProps;\n onPickValue?: (info: PointPickingResult) => void;\n lod?: number;\n outlineSelected?: boolean;\n};\n\nexport class LabelImageLayer extends Layer {\n public readonly type = \"LabelImageLayer\";\n\n private readonly source_: ChunkSource;\n private readonly region_: Region;\n private readonly lod_?: number;\n private colorMap_: LabelColorMap;\n private readonly onPickValue_?: (info: PointPickingResult) => void;\n private readonly outlineSelected_: boolean;\n private image_?: LabelImageRenderable;\n private imageChunk_?: Chunk;\n private pointerDownPos_: vec2 | null = null;\n private selectedValue_: number | null = null;\n\n constructor({\n source,\n region,\n colorMap = {},\n onPickValue,\n lod,\n outlineSelected = false,\n ...layerOptions\n }: LabelImageLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.source_ = source;\n this.region_ = region;\n this.colorMap_ = new LabelColorMap(colorMap);\n this.onPickValue_ = onPickValue;\n this.lod_ = lod;\n this.outlineSelected_ = outlineSelected;\n }\n\n public update() {\n switch (this.state) {\n case \"initialized\":\n this.load(this.region_);\n break;\n case \"loading\":\n case \"ready\":\n break;\n default: {\n const exhaustiveCheck: never = this.state;\n throw new Error(`Unhandled LayerState case: ${exhaustiveCheck}`);\n }\n }\n }\n\n public get colorMap(): LabelColorMap {\n return this.colorMap_;\n }\n\n public setColorMap(colorMap: LabelColorMapProps) {\n this.colorMap_ = new LabelColorMap(colorMap);\n if (this.image_) {\n this.image_.setColorMap(this.colorMap_);\n }\n }\n\n public setSelectedValue(value: number | null) {\n this.selectedValue_ = value;\n if (this.image_) {\n this.image_.setSelectedValue(this.selectedValue_);\n }\n }\n\n public onEvent(event: EventContext) {\n this.pointerDownPos_ = handlePointPickingEvent(\n event,\n this.pointerDownPos_,\n (world) => this.getValueAtWorld(world),\n this.outlineSelected_\n ? (info: PointPickingResult) => {\n this.setSelectedValue(info.value);\n this.onPickValue_?.(info);\n }\n : this.onPickValue_\n );\n }\n\n private async load(region: Region) {\n if (this.state !== \"initialized\") {\n throw new Error(`Trying to load chunks more than once.`);\n }\n this.setState(\"loading\");\n const loader = await this.source_.open();\n const attributes = loader.getAttributes();\n const lod = this.lod_ ?? attributes.length - 1;\n const chunk = await loader.loadRegion(region, lod);\n this.image_ = this.createImage(chunk);\n this.addObject(this.image_);\n this.setState(\"ready\");\n }\n\n private createImage(chunk: Chunk) {\n this.imageChunk_ = chunk; // Store chunk for value picking\n const image = new LabelImageRenderable({\n width: chunk.shape.x,\n height: chunk.shape.y,\n imageData: Texture2D.createWithChunk(chunk),\n colorMap: this.colorMap_,\n outlineSelected: this.outlineSelected_,\n selectedValue: this.selectedValue_,\n });\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n return image;\n }\n\n public getValueAtWorld(world: vec3): number | null {\n if (!this.image_ || !this.imageChunk_?.data) {\n return null;\n }\n\n // Transform world to local texture coordinates using inverse transform\n const localPos = vec3.transformMat4(\n vec3.create(),\n world,\n this.image_.transform.inverse\n );\n\n // Convert to pixel coordinates and bounds check\n const x = Math.floor(localPos[0]);\n const y = Math.floor(localPos[1]);\n if (\n x < 0 ||\n x >= this.imageChunk_.shape.x ||\n y < 0 ||\n y >= this.imageChunk_.shape.y\n ) {\n return null;\n }\n\n const pixelIndex = y * this.imageChunk_.shape.x + x;\n const data = this.imageChunk_.data;\n return data[pixelIndex];\n }\n}\n","export class AbortError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AbortError\";\n // Manually adjust the prototype to handle sub-classing Error\n // https://github.com/microsoft/TypeScript/wiki/FAQ#why-doesnt-extending-built-ins-like-error-array-and-map-work\n Object.setPrototypeOf(this, AbortError.prototype);\n }\n}\n\n// Executes a limited number of promises concurrently.\nexport class PromiseScheduler {\n private readonly maxConcurrent_: number;\n private readonly pending_: Array<() => Promise<void>> = [];\n private readonly abortController_ = new AbortController();\n private numRunning_ = 0;\n\n constructor(maxConcurrent: number) {\n if (maxConcurrent <= 0) {\n throw Error(`maxConcurrent (${maxConcurrent}) must be positive`);\n }\n this.maxConcurrent_ = maxConcurrent;\n }\n\n async submit<T>(task: () => Promise<T>): Promise<T> {\n this.abortController_.signal.throwIfAborted();\n return new Promise((resolve, reject) => {\n const promise = async () => {\n try {\n this.abortController_.signal.throwIfAborted();\n const result = await task();\n resolve(result);\n } catch (error) {\n reject(error);\n } finally {\n this.numRunning_--;\n this.maybeRunNext();\n }\n };\n this.pending_.push(promise);\n this.maybeRunNext();\n });\n }\n\n private maybeRunNext() {\n if (this.numRunning_ >= this.maxConcurrent_) return;\n const promise = this.pending_.shift();\n if (promise === undefined) return;\n this.numRunning_++;\n promise();\n }\n\n get abortSignal() {\n return this.abortController_.signal;\n }\n\n shutdown() {\n this.abortController_.abort(new AbortError(\"shutdown\"));\n }\n\n get numRunning() {\n return this.numRunning_;\n }\n\n get numPending() {\n return this.pending_.length;\n }\n}\n","import { Full, Interval, Region } from \"../data/region\";\nimport { Chunk, ChunkLoader, ChunkSource } from \"../data/chunk\";\nimport { AbortError, PromiseScheduler } from \"../data/promise_scheduler\";\nimport { Logger } from \"../utilities/logger\";\n\ntype SeriesAttributes = {\n start: number;\n stop: number;\n scale: number;\n length: number;\n};\n\ntype LoadingToken = {\n canceled: boolean;\n index: number;\n};\n\nexport type SetIndexResult = {\n success: boolean;\n reason?: \"duplicate\" | \"canceled\";\n chunk?: Chunk;\n};\n\ntype ImageSeriesLoaderProps = {\n source: ChunkSource;\n region: Region;\n seriesDimensionName: string;\n lod?: number;\n};\n\nexport class ImageSeriesLoader {\n private readonly source_: ChunkSource;\n private readonly region_: Region;\n private readonly seriesDimensionName_: string;\n private readonly seriesIndex_: Interval | Full;\n private readonly scheduler_: PromiseScheduler = new PromiseScheduler(16);\n private readonly lod_?: number;\n private loader_: ChunkLoader | null = null;\n private seriesAttributes_?: SeriesAttributes;\n private loadingToken_: LoadingToken | null = null;\n public dataChunks_: Chunk[] = [];\n\n constructor(props: ImageSeriesLoaderProps) {\n this.source_ = props.source;\n this.region_ = props.region;\n this.lod_ = props.lod;\n this.seriesDimensionName_ = props.seriesDimensionName;\n const seriesDimensionalIndex = props.region.find(\n (x) => x.dimension == props.seriesDimensionName\n );\n if (seriesDimensionalIndex === undefined) {\n throw new Error(\n `Series dimension '${props.seriesDimensionName}' not in region ${JSON.stringify(props.region)}`\n );\n }\n if (seriesDimensionalIndex.index.type === \"point\") {\n throw new Error(\n \"Series dimension index in region must be an interval or 'full', not a point value\"\n );\n }\n this.seriesIndex_ = seriesDimensionalIndex.index;\n }\n\n public async setPosition(position: number): Promise<SetIndexResult> {\n const seriesAttributes = await this.loadSeriesAttributes();\n const index = Math.round(\n (position - seriesAttributes.start) / seriesAttributes.scale\n );\n return await this.setIndex(index);\n }\n\n public async setIndex(index: number): Promise<SetIndexResult> {\n const token = this.loadingToken_;\n if (token) {\n if (token.index === index && !token.canceled) {\n Logger.debug(\n \"ImageSeriesLoader\",\n \"Ignoring duplicate active setIndex request\"\n );\n return { success: false, reason: \"duplicate\" };\n } else {\n Logger.debug(\n \"ImageSeriesLoader\",\n `Cancelling setIndex request for index ${token.index}, new requested index is ${index}`\n );\n token.canceled = true;\n }\n }\n let chunk = this.dataChunks_[index];\n if (chunk === undefined) {\n const newToken = { canceled: false, index: index };\n this.loadingToken_ = newToken;\n chunk = await this.loadChunkAtIndex(index, newToken);\n if (newToken.canceled) return { success: false, reason: \"canceled\" };\n }\n return { success: true, chunk };\n }\n\n public shutdown() {\n this.scheduler_.shutdown();\n }\n\n public async loadSeriesAttributes() {\n if (this.seriesAttributes_) {\n return this.seriesAttributes_;\n }\n const loader = await this.getLoader();\n const attributes = loader.getAttributes();\n const attributesForLOD = attributes[this.lod_ ?? attributes.length - 1];\n\n const seriesIndex = attributesForLOD.dimensionNames.findIndex(\n (dim) => dim === this.seriesDimensionName_\n );\n if (seriesIndex === -1) {\n throw new Error(\n `Series dimension \"${this.seriesDimensionName_}\" not found in loader dimensions: ${attributesForLOD.dimensionNames}`\n );\n }\n const seriesDimScale = attributesForLOD.scale[seriesIndex];\n const seriesMax = attributesForLOD.shape[seriesIndex] * seriesDimScale;\n\n const indexIsFull = this.seriesIndex_.type === \"full\";\n const seriesStart = indexIsFull ? 0 : this.seriesIndex_.start;\n const seriesStop = indexIsFull ? seriesMax : this.seriesIndex_.stop;\n\n const seriesLength = Math.round(\n (seriesStop - seriesStart) / seriesDimScale\n );\n this.dataChunks_ = new Array(seriesLength);\n\n this.seriesAttributes_ = {\n start: seriesStart,\n stop: seriesStop,\n scale: seriesDimScale,\n length: seriesLength,\n };\n return this.seriesAttributes_;\n }\n\n public async loadChunkAtIndex(index: number, token?: LoadingToken) {\n const seriesAttributes = await this.loadSeriesAttributes();\n if (index < 0 || index >= seriesAttributes.length) {\n throw new Error(\n `Requested index ${index} is out of bounds [0, ${seriesAttributes.length - 1}]`\n );\n }\n\n // replace the series region with a point region for the requested index\n const position = seriesAttributes.start + index * seriesAttributes.scale;\n const pointRegion = this.region_.filter(\n (dimIndex) => dimIndex.dimension !== this.seriesDimensionName_\n );\n pointRegion.push({\n dimension: this.seriesDimensionName_,\n index: { type: \"point\", value: position },\n });\n\n const loader = await this.getLoader();\n const attributes = loader.getAttributes();\n const lod = this.lod_ ?? attributes.length - 1;\n\n const chunk = await loader.loadRegion(pointRegion, lod, this.scheduler_);\n this.dataChunks_[index] = chunk;\n\n if (token && token.canceled) {\n this.loadingToken_ = null;\n }\n return chunk;\n }\n\n public async preloadAllChunks() {\n const { length } = await this.loadSeriesAttributes();\n // Load remaining slices concurrently, exclude the token so they don't get set\n const loadPromises = [];\n for (let index = 0; index < length; index++) {\n loadPromises.push(this.loadChunkAtIndex(index));\n }\n\n // Wait for all slices to finish loading\n const results = await Promise.allSettled(loadPromises);\n for (const result of results) {\n if (result.status === \"rejected\") {\n if (result.reason instanceof AbortError) {\n // reject the promise because this means the layer was closed\n return Promise.reject(result.reason);\n } else {\n Logger.error(\n \"ImageSeriesLoader\",\n `Error loading slice: ${result.reason}`\n );\n }\n }\n }\n }\n\n private async getLoader() {\n this.loader_ ??= await this.source_.open();\n return this.loader_;\n }\n}\n","import { Layer, LayerOptions } from \"../core/layer\";\nimport { Region } from \"../data/region\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { ChannelProps, ChannelsEnabled } from \"../objects/textures/channel\";\nimport { ImageRenderable } from \"../objects/renderable/image_renderable\";\nimport { ImageSeriesLoader, SetIndexResult } from \"./image_series_loader\";\n\nexport type ImageSeriesLayerProps = LayerOptions & {\n source: ChunkSource;\n region: Region;\n seriesDimensionName: string;\n channelProps?: ChannelProps[];\n lod?: number;\n};\n\nexport class ImageSeriesLayer extends Layer implements ChannelsEnabled {\n public readonly type = \"ImageSeriesLayer\";\n private readonly seriesLoader_: ImageSeriesLoader;\n private readonly initialChannelProps_?: ChannelProps[];\n private readonly channelChangeCallbacks_: Array<() => void> = [];\n private channelProps_?: ChannelProps[];\n private texture_: Texture2DArray | null = null;\n private image_?: ImageRenderable;\n private extent_?: { x: number; y: number };\n\n constructor({\n source,\n region,\n seriesDimensionName,\n channelProps,\n lod,\n ...layerOptions\n }: ImageSeriesLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.channelProps_ = channelProps;\n this.initialChannelProps_ = channelProps;\n this.seriesLoader_ = new ImageSeriesLoader({\n source,\n region,\n seriesDimensionName,\n lod,\n });\n }\n\n public update() {\n if (this.state === \"initialized\") {\n this.setState(\"loading\");\n this.seriesLoader_.loadSeriesAttributes();\n }\n }\n\n public get channelProps(): ChannelProps[] | undefined {\n return this.channelProps_;\n }\n\n public setChannelProps(channelProps: ChannelProps[]) {\n this.channelProps_ = channelProps;\n this.image_?.setChannelProps(channelProps);\n this.channelChangeCallbacks_.forEach((callback) => {\n callback();\n });\n }\n\n public resetChannelProps(): void {\n if (this.initialChannelProps_ !== undefined) {\n this.setChannelProps(this.initialChannelProps_);\n }\n }\n\n public addChannelChangeCallback(callback: () => void): void {\n this.channelChangeCallbacks_.push(callback);\n }\n\n public removeChannelChangeCallback(callback: () => void): void {\n const index = this.channelChangeCallbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.channelChangeCallbacks_.splice(index, 1);\n }\n\n public async setPosition(position: number): Promise<SetIndexResult> {\n const result = await this.seriesLoader_.setPosition(position);\n return this.processIndexResult(result);\n }\n\n public async setIndex(index: number): Promise<SetIndexResult> {\n const result = await this.seriesLoader_.setIndex(index);\n return this.processIndexResult(result);\n }\n\n public close() {\n this.seriesLoader_.shutdown();\n }\n\n public async preloadSeries() {\n return this.seriesLoader_.preloadAllChunks();\n }\n\n public get extent(): { x: number; y: number } | undefined {\n return this.extent_;\n }\n\n private processIndexResult(result: SetIndexResult) {\n if (result.chunk) {\n this.setData(result.chunk);\n this.setState(\"ready\");\n }\n return result;\n }\n\n private setData(chunk: Chunk) {\n if (!this.texture_ || !this.image_) {\n this.texture_ = Texture2DArray.createWithChunk(chunk);\n this.image_ = this.createImage(chunk, this.texture_, this.channelProps_);\n this.addObject(this.image_);\n\n // extent does not change after renderable creation\n this.extent_ = {\n x: chunk.shape.x * chunk.scale.x,\n y: chunk.shape.y * chunk.scale.y,\n };\n } else if (chunk.data) {\n this.texture_.updateWithChunk(chunk);\n }\n }\n\n private createImage(\n chunk: Chunk,\n texture: Texture2DArray,\n channelProps?: ChannelProps[]\n ) {\n const image = new ImageRenderable(\n chunk.shape.x,\n chunk.shape.y,\n texture,\n channelProps\n );\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n return image;\n }\n}\n","export class NodeNotFoundError extends Error {\n constructor(context, options = {}) {\n super(`Node not found: ${context}`, options);\n this.name = \"NodeNotFoundError\";\n }\n}\nexport class KeyError extends Error {\n constructor(path) {\n super(`Missing key: ${path}`);\n this.name = \"KeyError\";\n }\n}\n","/**\n * A codec for bit-rounding.\n *\n * Reduces floating-point precision by truncating mantissa bits during encoding.\n * Decoding is a no-op as the process is lossy and precision cannot be restored.\n *\n * Note: {@link BitroundCodec.encode} is not yet implemented since Zarrita is\n * primarily used in read-only contexts (web browser). If you need encoding support,\n * please open an issue at {@link https://github.com/manzt/zarrita.js/issues}.\n *\n * @see {@link https://github.com/zarr-developers/numcodecs/blob/main/numcodecs/bitround.py}\n * for the original Python implementation.\n *\n * @remarks\n * Data types are not validated, and `float16` arrays are not supported (reflecting browser support).\n */\nexport class BitroundCodec {\n kind = \"array_to_array\";\n constructor(configuration, _meta) {\n if (configuration.keepbits < 0) {\n throw new Error(\"keepbits must be zero or positive\");\n }\n }\n static fromConfig(configuration, meta) {\n return new BitroundCodec(configuration, meta);\n }\n /**\n * Encode a chunk of data with bit-rounding.\n * @param _arr - The chunk to encode\n */\n encode(_arr) {\n throw new Error(\"`BitroundCodec.encode` is not implemented. Please open an issue at https://github.com/manzt/zarrita.js/issues.\");\n }\n /**\n * Decode a chunk of data (no-op).\n * @param arr - The chunk to decode\n * @returns The decoded chunk\n */\n decode(arr) {\n return arr; // No-op as bit-rounding is lossy\n }\n}\n","export class BoolArray {\n #bytes;\n constructor(x, byteOffset, length) {\n if (typeof x === \"number\") {\n this.#bytes = new Uint8Array(x);\n }\n else if (x instanceof ArrayBuffer) {\n this.#bytes = new Uint8Array(x, byteOffset, length);\n }\n else {\n this.#bytes = new Uint8Array(Array.from(x, (v) => (v ? 1 : 0)));\n }\n }\n get BYTES_PER_ELEMENT() {\n return 1;\n }\n get byteOffset() {\n return this.#bytes.byteOffset;\n }\n get byteLength() {\n return this.#bytes.byteLength;\n }\n get buffer() {\n return this.#bytes.buffer;\n }\n get length() {\n return this.#bytes.length;\n }\n get(idx) {\n let value = this.#bytes[idx];\n return typeof value === \"number\" ? value !== 0 : value;\n }\n set(idx, value) {\n this.#bytes[idx] = value ? 1 : 0;\n }\n fill(value) {\n this.#bytes.fill(value ? 1 : 0);\n }\n *[Symbol.iterator]() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n}\nexport class ByteStringArray {\n _data;\n chars;\n #encoder;\n constructor(chars, x, byteOffset, length) {\n this.chars = chars;\n this.#encoder = new TextEncoder();\n if (typeof x === \"number\") {\n this._data = new Uint8Array(x * chars);\n }\n else if (x instanceof ArrayBuffer) {\n if (length)\n length = length * chars;\n this._data = new Uint8Array(x, byteOffset, length);\n }\n else {\n let values = Array.from(x);\n this._data = new Uint8Array(values.length * chars);\n for (let i = 0; i < values.length; i++) {\n this.set(i, values[i]);\n }\n }\n }\n get BYTES_PER_ELEMENT() {\n return this.chars;\n }\n get byteOffset() {\n return this._data.byteOffset;\n }\n get byteLength() {\n return this._data.byteLength;\n }\n get buffer() {\n return this._data.buffer;\n }\n get length() {\n return this.byteLength / this.BYTES_PER_ELEMENT;\n }\n get(idx) {\n const view = new Uint8Array(this.buffer, this.byteOffset + this.chars * idx, this.chars);\n // biome-ignore lint/suspicious/noControlCharactersInRegex: necessary for null byte removal\n return new TextDecoder().decode(view).replace(/\\x00/g, \"\");\n }\n set(idx, value) {\n const view = new Uint8Array(this.buffer, this.byteOffset + this.chars * idx, this.chars);\n view.fill(0); // clear current\n view.set(this.#encoder.encode(value));\n }\n fill(value) {\n const encoded = this.#encoder.encode(value);\n for (let i = 0; i < this.length; i++) {\n this._data.set(encoded, i * this.chars);\n }\n }\n *[Symbol.iterator]() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n}\nexport class UnicodeStringArray {\n #data;\n chars;\n constructor(chars, x, byteOffset, length) {\n this.chars = chars;\n if (typeof x === \"number\") {\n this.#data = new Int32Array(x * chars);\n }\n else if (x instanceof ArrayBuffer) {\n if (length)\n length *= chars;\n this.#data = new Int32Array(x, byteOffset, length);\n }\n else {\n const values = x;\n const d = new UnicodeStringArray(chars, 1);\n this.#data = new Int32Array((function* () {\n for (let str of values) {\n d.set(0, str);\n yield* d.#data;\n }\n })());\n }\n }\n get BYTES_PER_ELEMENT() {\n return this.#data.BYTES_PER_ELEMENT * this.chars;\n }\n get byteLength() {\n return this.#data.byteLength;\n }\n get byteOffset() {\n return this.#data.byteOffset;\n }\n get buffer() {\n return this.#data.buffer;\n }\n get length() {\n return this.#data.length / this.chars;\n }\n get(idx) {\n const offset = this.chars * idx;\n let result = \"\";\n for (let i = 0; i < this.chars; i++) {\n result += String.fromCodePoint(this.#data[offset + i]);\n }\n // biome-ignore lint/suspicious/noControlCharactersInRegex: necessary for null byte removal\n return result.replace(/\\u0000/g, \"\");\n }\n set(idx, value) {\n const offset = this.chars * idx;\n const view = this.#data.subarray(offset, offset + this.chars);\n view.fill(0); // clear current\n for (let i = 0; i < this.chars; i++) {\n view[i] = value.codePointAt(i) ?? 0;\n }\n }\n fill(value) {\n // encode once\n this.set(0, value);\n // copy the encoded values to all other elements\n let encoded = this.#data.subarray(0, this.chars);\n for (let i = 1; i < this.length; i++) {\n this.#data.set(encoded, i * this.chars);\n }\n }\n *[Symbol.iterator]() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n}\n","import { BoolArray, ByteStringArray, UnicodeStringArray, } from \"@zarrita/typedarray\";\nexport function json_encode_object(o) {\n const str = JSON.stringify(o, null, 2);\n return new TextEncoder().encode(str);\n}\nexport function json_decode_object(bytes) {\n const str = new TextDecoder().decode(bytes);\n return JSON.parse(str);\n}\nexport function byteswap_inplace(view, bytes_per_element) {\n const numFlips = bytes_per_element / 2;\n const endByteIndex = bytes_per_element - 1;\n let t = 0;\n for (let i = 0; i < view.length; i += bytes_per_element) {\n for (let j = 0; j < numFlips; j += 1) {\n t = view[i + j];\n view[i + j] = view[i + endByteIndex - j];\n view[i + endByteIndex - j] = t;\n }\n }\n}\nconst CONSTRUCTORS = {\n int8: Int8Array,\n int16: Int16Array,\n int32: Int32Array,\n int64: globalThis.BigInt64Array,\n uint8: Uint8Array,\n uint16: Uint16Array,\n uint32: Uint32Array,\n uint64: globalThis.BigUint64Array,\n float32: Float32Array,\n float64: Float64Array,\n bool: BoolArray,\n};\nconst V2_STRING_REGEX = /v2:([US])(\\d+)/;\nexport function get_ctr(data_type) {\n if (data_type === \"v2:object\") {\n return globalThis.Array;\n }\n let match = data_type.match(V2_STRING_REGEX);\n if (match) {\n let [, kind, chars] = match;\n // @ts-expect-error\n return (kind === \"U\" ? UnicodeStringArray : ByteStringArray).bind(null, Number(chars));\n }\n // @ts-expect-error - We've checked that the key exists\n let ctr = CONSTRUCTORS[data_type];\n if (!ctr) {\n throw new Error(`Unknown or unsupported data_type: ${data_type}`);\n }\n return ctr;\n}\n/** Compute strides for 'C' or 'F' ordered array from shape */\nexport function get_strides(shape, order) {\n return (order === \"C\" ? row_major_stride : col_major_stride)(shape);\n}\nfunction row_major_stride(shape) {\n const ndim = shape.length;\n const stride = globalThis.Array(ndim);\n for (let i = ndim - 1, step = 1; i >= 0; i--) {\n stride[i] = step;\n step *= shape[i];\n }\n return stride;\n}\nfunction col_major_stride(shape) {\n const ndim = shape.length;\n const stride = globalThis.Array(ndim);\n for (let i = 0, step = 1; i < ndim; i++) {\n stride[i] = step;\n step *= shape[i];\n }\n return stride;\n}\n// https://zarr-specs.readthedocs.io/en/latest/v3/core/v3.0.html#chunk-key-encoding\nexport function create_chunk_key_encoder({ name, configuration, }) {\n if (name === \"default\") {\n const separator = configuration?.separator ?? \"/\";\n return (chunk_coords) => [\"c\", ...chunk_coords].join(separator);\n }\n if (name === \"v2\") {\n const separator = configuration?.separator ?? \".\";\n return (chunk_coords) => chunk_coords.join(separator) || \"0\";\n }\n throw new Error(`Unknown chunk key encoding: ${name}`);\n}\nexport function get_array_order(codecs) {\n const maybe_transpose_codec = codecs.find((c) => c.name === \"transpose\");\n return maybe_transpose_codec?.configuration?.order === \"F\" ? \"F\" : \"C\";\n}\nconst endian_regex = /^([<|>])(.*)$/;\nfunction coerce_dtype(dtype) {\n if (dtype === \"|O\") {\n return { data_type: \"v2:object\" };\n }\n let match = dtype.match(endian_regex);\n if (!match) {\n throw new Error(`Invalid dtype: ${dtype}`);\n }\n let [, endian, rest] = match;\n let data_type = {\n b1: \"bool\",\n i1: \"int8\",\n u1: \"uint8\",\n i2: \"int16\",\n u2: \"uint16\",\n i4: \"int32\",\n u4: \"uint32\",\n i8: \"int64\",\n u8: \"uint64\",\n f4: \"float32\",\n f8: \"float64\",\n }[rest] ??\n (rest.startsWith(\"S\") || rest.startsWith(\"U\") ? `v2:${rest}` : undefined);\n if (!data_type) {\n throw new Error(`Unsupported or unknown dtype: ${dtype}`);\n }\n if (endian === \"|\") {\n return { data_type };\n }\n return { data_type, endian: endian === \"<\" ? \"little\" : \"big\" };\n}\nexport function v2_to_v3_array_metadata(meta, attributes = {}) {\n let codecs = [];\n let dtype = coerce_dtype(meta.dtype);\n if (meta.order === \"F\") {\n codecs.push({ name: \"transpose\", configuration: { order: \"F\" } });\n }\n if (\"endian\" in dtype && dtype.endian === \"big\") {\n codecs.push({ name: \"bytes\", configuration: { endian: \"big\" } });\n }\n for (let { id, ...configuration } of meta.filters ?? []) {\n codecs.push({ name: id, configuration });\n }\n if (meta.compressor) {\n let { id, ...configuration } = meta.compressor;\n codecs.push({ name: id, configuration });\n }\n return {\n zarr_format: 3,\n node_type: \"array\",\n shape: meta.shape,\n data_type: dtype.data_type,\n chunk_grid: {\n name: \"regular\",\n configuration: {\n chunk_shape: meta.chunks,\n },\n },\n chunk_key_encoding: {\n name: \"v2\",\n configuration: {\n separator: meta.dimension_separator ?? \".\",\n },\n },\n codecs,\n fill_value: meta.fill_value,\n attributes,\n };\n}\nexport function v2_to_v3_group_metadata(_meta, attributes = {}) {\n return {\n zarr_format: 3,\n node_type: \"group\",\n attributes,\n };\n}\nexport function is_dtype(dtype, query) {\n if (query !== \"number\" &&\n query !== \"bigint\" &&\n query !== \"boolean\" &&\n query !== \"object\" &&\n query !== \"string\") {\n return dtype === query;\n }\n let is_boolean = dtype === \"bool\";\n if (query === \"boolean\")\n return is_boolean;\n let is_string = dtype.startsWith(\"v2:U\") || dtype.startsWith(\"v2:S\");\n if (query === \"string\")\n return is_string;\n let is_bigint = dtype === \"int64\" || dtype === \"uint64\";\n if (query === \"bigint\")\n return is_bigint;\n let is_object = dtype === \"v2:object\";\n if (query === \"object\")\n return is_object;\n return !is_string && !is_bigint && !is_boolean && !is_object;\n}\nexport function is_sharding_codec(codec) {\n return codec?.name === \"sharding_indexed\";\n}\nexport function ensure_correct_scalar(metadata) {\n if ((metadata.data_type === \"uint64\" || metadata.data_type === \"int64\") &&\n metadata.fill_value != null) {\n // @ts-expect-error - We've narrowed the type of fill_value correctly\n return BigInt(metadata.fill_value);\n }\n return metadata.fill_value;\n}\n","import { byteswap_inplace, get_array_order, get_ctr, get_strides, } from \"../util.js\";\nconst LITTLE_ENDIAN_OS = system_is_little_endian();\nfunction system_is_little_endian() {\n const a = new Uint32Array([0x12345678]);\n const b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return !(b[0] === 0x12);\n}\nfunction bytes_per_element(TypedArray) {\n if (\"BYTES_PER_ELEMENT\" in TypedArray) {\n return TypedArray.BYTES_PER_ELEMENT;\n }\n // Unicode string array is backed by a Int32Array.\n return 4;\n}\nexport class BytesCodec {\n kind = \"array_to_bytes\";\n #strides;\n #TypedArray;\n #BYTES_PER_ELEMENT;\n #shape;\n #endian;\n constructor(configuration, meta) {\n this.#endian = configuration?.endian;\n this.#TypedArray = get_ctr(meta.data_type);\n this.#shape = meta.shape;\n this.#strides = get_strides(meta.shape, get_array_order(meta.codecs));\n // TODO: fix me.\n // hack to get bytes per element since it's dynamic for string types.\n const sample = new this.#TypedArray(0);\n this.#BYTES_PER_ELEMENT = sample.BYTES_PER_ELEMENT;\n }\n static fromConfig(configuration, meta) {\n return new BytesCodec(configuration, meta);\n }\n encode(arr) {\n let bytes = new Uint8Array(arr.data.buffer);\n if (LITTLE_ENDIAN_OS && this.#endian === \"big\") {\n byteswap_inplace(bytes, bytes_per_element(this.#TypedArray));\n }\n return bytes;\n }\n decode(bytes) {\n if (LITTLE_ENDIAN_OS && this.#endian === \"big\") {\n byteswap_inplace(bytes, bytes_per_element(this.#TypedArray));\n }\n return {\n data: new this.#TypedArray(bytes.buffer, bytes.byteOffset, bytes.byteLength / this.#BYTES_PER_ELEMENT),\n shape: this.#shape,\n stride: this.#strides,\n };\n }\n}\n","export class Crc32cCodec {\n kind = \"bytes_to_bytes\";\n static fromConfig() {\n return new Crc32cCodec();\n }\n encode(_) {\n throw new Error(\"Not implemented\");\n }\n decode(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength - 4);\n }\n}\n","import { get_strides, json_decode_object } from \"../util.js\";\n// Reference: https://stackoverflow.com/a/21897413\nfunction throw_on_nan_replacer(_key, value) {\n if (Number.isNaN(value)) {\n throw new Error(\"JsonCodec allow_nan is false but NaN was encountered during encoding.\");\n }\n if (value === Number.POSITIVE_INFINITY) {\n throw new Error(\"JsonCodec allow_nan is false but Infinity was encountered during encoding.\");\n }\n if (value === Number.NEGATIVE_INFINITY) {\n throw new Error(\"JsonCodec allow_nan is false but -Infinity was encountered during encoding.\");\n }\n return value;\n}\n// Reference: https://gist.github.com/davidfurlong/463a83a33b70a3b6618e97ec9679e490\nfunction sort_keys_replacer(_key, value) {\n return value instanceof Object && !Array.isArray(value)\n ? Object.keys(value)\n .sort()\n .reduce((sorted, key) => {\n sorted[key] = value[key];\n return sorted;\n }, {})\n : value;\n}\nexport class JsonCodec {\n configuration;\n kind = \"array_to_bytes\";\n #encoder_config;\n #decoder_config;\n constructor(configuration = {}) {\n this.configuration = configuration;\n // Reference: https://github.com/zarr-developers/numcodecs/blob/0878717a3613d91a453fe3d3716aa9c67c023a8b/numcodecs/json.py#L36\n const { encoding = \"utf-8\", skipkeys = false, ensure_ascii = true, check_circular = true, allow_nan = true, sort_keys = true, indent, strict = true, } = configuration;\n let separators = configuration.separators;\n if (!separators) {\n // ensure separators are explicitly specified, and consistent behaviour across\n // Python versions, and most compact representation if indent is None\n if (!indent) {\n separators = [\",\", \":\"];\n }\n else {\n separators = [\", \", \": \"];\n }\n }\n this.#encoder_config = {\n encoding,\n skipkeys,\n ensure_ascii,\n check_circular,\n allow_nan,\n indent,\n separators,\n sort_keys,\n };\n this.#decoder_config = { strict };\n }\n static fromConfig(configuration) {\n return new JsonCodec(configuration);\n }\n encode(buf) {\n const { indent, encoding, ensure_ascii, check_circular, allow_nan, sort_keys, } = this.#encoder_config;\n if (encoding !== \"utf-8\") {\n throw new Error(\"JsonCodec does not yet support non-utf-8 encoding.\");\n }\n const replacer_functions = [];\n if (!check_circular) {\n // By default, for JSON.stringify,\n // a TypeError will be thrown if one attempts to encode an object with circular references\n throw new Error(\"JsonCodec does not yet support skipping the check for circular references during encoding.\");\n }\n if (!allow_nan) {\n // Throw if NaN/Infinity/-Infinity are encountered during encoding.\n replacer_functions.push(throw_on_nan_replacer);\n }\n if (sort_keys) {\n // We can ensure keys are sorted but not really the opposite since\n // there is no guarantee of key ordering in JS.\n replacer_functions.push(sort_keys_replacer);\n }\n const items = Array.from(buf.data);\n items.push(\"|O\");\n items.push(buf.shape);\n let replacer = undefined;\n if (replacer_functions.length) {\n replacer = (key, value) => {\n let new_value = value;\n for (let sub_replacer of replacer_functions) {\n new_value = sub_replacer(key, new_value);\n }\n return new_value;\n };\n }\n let json_str = JSON.stringify(items, replacer, indent);\n if (ensure_ascii) {\n // If ensure_ascii is true (the default), the output is guaranteed\n // to have all incoming non-ASCII characters escaped.\n // If ensure_ascii is false, these characters will be output as-is.\n // Reference: https://stackoverflow.com/a/31652607\n json_str = json_str.replace(/[\\u007F-\\uFFFF]/g, (chr) => {\n const full_str = `0000${chr.charCodeAt(0).toString(16)}`;\n const sub_str = full_str.substring(full_str.length - 4);\n return `\\\\u${sub_str}`;\n });\n }\n return new TextEncoder().encode(json_str);\n }\n decode(bytes) {\n const { strict } = this.#decoder_config;\n if (!strict) {\n // (i.e., allowing control characters inside strings)\n throw new Error(\"JsonCodec does not yet support non-strict decoding.\");\n }\n const items = json_decode_object(bytes);\n const shape = items.pop();\n items.pop(); // Pop off dtype (unused)\n if (!shape) {\n // O-d case\n throw new Error(\"0D not implemented for JsonCodec.\");\n }\n const stride = get_strides(shape, \"C\");\n const data = items;\n return { data, shape, stride };\n }\n}\n","import { BoolArray, ByteStringArray, UnicodeStringArray, } from \"@zarrita/typedarray\";\nimport { get_strides } from \"../util.js\";\nfunction proxy(arr) {\n if (arr instanceof BoolArray ||\n arr instanceof ByteStringArray ||\n arr instanceof UnicodeStringArray) {\n // @ts-expect-error - TS cannot infer arr is a TypedArrayProxy<D>\n const arrp = new Proxy(arr, {\n get(target, prop) {\n return target.get(Number(prop));\n },\n set(target, prop, value) {\n // @ts-expect-error - value is OK\n target.set(Number(prop), value);\n return true;\n },\n });\n return arrp;\n }\n // @ts-expect-error - TS cannot infer arr is a TypedArrayProxy<D>\n return arr;\n}\nfunction empty_like(chunk, order) {\n let data;\n if (chunk.data instanceof ByteStringArray ||\n chunk.data instanceof UnicodeStringArray) {\n data = new chunk.constructor(\n // @ts-expect-error\n chunk.data.length, chunk.data.chars);\n }\n else {\n data = new chunk.constructor(chunk.data.length);\n }\n return {\n data,\n shape: chunk.shape,\n stride: get_strides(chunk.shape, order),\n };\n}\nfunction convert_array_order(src, target) {\n let out = empty_like(src, target);\n let n_dims = src.shape.length;\n let size = src.data.length;\n let index = Array(n_dims).fill(0);\n let src_data = proxy(src.data);\n let out_data = proxy(out.data);\n for (let src_idx = 0; src_idx < size; src_idx++) {\n let out_idx = 0;\n for (let dim = 0; dim < n_dims; dim++) {\n out_idx += index[dim] * out.stride[dim];\n }\n out_data[out_idx] = src_data[src_idx];\n index[0] += 1;\n for (let dim = 0; dim < n_dims; dim++) {\n if (index[dim] === src.shape[dim]) {\n if (dim + 1 === n_dims) {\n break;\n }\n index[dim] = 0;\n index[dim + 1] += 1;\n }\n }\n }\n return out;\n}\nfunction get_order(arr) {\n // Assume C order if no stride is given\n if (!arr.stride)\n return \"C\";\n let row_major_strides = get_strides(arr.shape, \"C\");\n return arr.stride.every((s, i) => s === row_major_strides[i]) ? \"C\" : \"F\";\n}\nexport class TransposeCodec {\n configuration;\n kind = \"array_to_array\";\n constructor(configuration) {\n this.configuration = configuration;\n }\n static fromConfig(configuration) {\n return new TransposeCodec(configuration);\n }\n encode(arr) {\n if (get_order(arr) === this.configuration?.order) {\n return arr;\n }\n return convert_array_order(arr, this.configuration?.order ?? \"C\");\n }\n decode(arr) {\n return arr;\n }\n}\n","import { get_strides } from \"../util.js\";\nexport class VLenUTF8 {\n kind = \"array_to_bytes\";\n #shape;\n #strides;\n constructor(shape) {\n this.#shape = shape;\n this.#strides = get_strides(shape, \"C\");\n }\n static fromConfig(_, meta) {\n return new VLenUTF8(meta.shape);\n }\n encode(_chunk) {\n throw new Error(\"Method not implemented.\");\n }\n decode(bytes) {\n let decoder = new TextDecoder();\n let view = new DataView(bytes.buffer);\n let data = Array(view.getUint32(0, true));\n let pos = 4;\n for (let i = 0; i < data.length; i++) {\n let item_length = view.getUint32(pos, true);\n pos += 4;\n data[i] = decoder.decode(bytes.buffer.slice(pos, pos + item_length));\n pos += item_length;\n }\n return { data, shape: this.#shape, stride: this.#strides };\n }\n}\n","import { BitroundCodec } from \"./codecs/bitround.js\";\nimport { BytesCodec } from \"./codecs/bytes.js\";\nimport { Crc32cCodec } from \"./codecs/crc32c.js\";\nimport { JsonCodec } from \"./codecs/json2.js\";\nimport { TransposeCodec } from \"./codecs/transpose.js\";\nimport { VLenUTF8 } from \"./codecs/vlen-utf8.js\";\nfunction create_default_registry() {\n return new Map()\n .set(\"blosc\", () => import(\"numcodecs/blosc\").then((m) => m.default))\n .set(\"gzip\", () => import(\"numcodecs/gzip\").then((m) => m.default))\n .set(\"lz4\", () => import(\"numcodecs/lz4\").then((m) => m.default))\n .set(\"zlib\", () => import(\"numcodecs/zlib\").then((m) => m.default))\n .set(\"zstd\", () => import(\"numcodecs/zstd\").then((m) => m.default))\n .set(\"transpose\", () => TransposeCodec)\n .set(\"bytes\", () => BytesCodec)\n .set(\"crc32c\", () => Crc32cCodec)\n .set(\"vlen-utf8\", () => VLenUTF8)\n .set(\"json2\", () => JsonCodec)\n .set(\"bitround\", () => BitroundCodec);\n}\nexport const registry = create_default_registry();\nexport function create_codec_pipeline(chunk_metadata) {\n let codecs;\n return {\n async encode(chunk) {\n if (!codecs)\n codecs = await load_codecs(chunk_metadata);\n for (const codec of codecs.array_to_array) {\n chunk = await codec.encode(chunk);\n }\n let bytes = await codecs.array_to_bytes.encode(chunk);\n for (const codec of codecs.bytes_to_bytes) {\n bytes = await codec.encode(bytes);\n }\n return bytes;\n },\n async decode(bytes) {\n if (!codecs)\n codecs = await load_codecs(chunk_metadata);\n for (let i = codecs.bytes_to_bytes.length - 1; i >= 0; i--) {\n bytes = await codecs.bytes_to_bytes[i].decode(bytes);\n }\n let chunk = await codecs.array_to_bytes.decode(bytes);\n for (let i = codecs.array_to_array.length - 1; i >= 0; i--) {\n chunk = await codecs.array_to_array[i].decode(chunk);\n }\n return chunk;\n },\n };\n}\nasync function load_codecs(chunk_meta) {\n let promises = chunk_meta.codecs.map(async (meta) => {\n let Codec = await registry.get(meta.name)?.();\n if (!Codec) {\n throw new Error(`Unknown codec: ${meta.name}`);\n }\n return { Codec, meta };\n });\n let array_to_array = [];\n let array_to_bytes;\n let bytes_to_bytes = [];\n for await (let { Codec, meta } of promises) {\n let codec = Codec.fromConfig(meta.configuration, chunk_meta);\n switch (codec.kind) {\n case \"array_to_array\":\n array_to_array.push(codec);\n break;\n case \"array_to_bytes\":\n array_to_bytes = codec;\n break;\n default:\n bytes_to_bytes.push(codec);\n }\n }\n if (!array_to_bytes) {\n if (!is_typed_array_like_meta(chunk_meta)) {\n throw new Error(`Cannot encode ${chunk_meta.data_type} to bytes without a codec`);\n }\n array_to_bytes = BytesCodec.fromConfig({ endian: \"little\" }, chunk_meta);\n }\n return { array_to_array, array_to_bytes, bytes_to_bytes };\n}\nfunction is_typed_array_like_meta(meta) {\n return meta.data_type !== \"v2:object\";\n}\n","import { create_codec_pipeline } from \"../codecs.js\";\nconst MAX_BIG_UINT = 18446744073709551615n;\nexport function create_sharded_chunk_getter(location, shard_shape, encode_shard_key, sharding_config) {\n if (location.store.getRange === undefined) {\n throw new Error(\"Store does not support range requests\");\n }\n let get_range = location.store.getRange.bind(location.store);\n let index_shape = shard_shape.map((d, i) => d / sharding_config.chunk_shape[i]);\n let index_codec = create_codec_pipeline({\n data_type: \"uint64\",\n shape: [...index_shape, 2],\n codecs: sharding_config.index_codecs,\n });\n let cache = {};\n return async (chunk_coord) => {\n let shard_coord = chunk_coord.map((d, i) => Math.floor(d / index_shape[i]));\n let shard_path = location.resolve(encode_shard_key(shard_coord)).path;\n let index;\n if (shard_path in cache) {\n index = cache[shard_path];\n }\n else {\n let checksum_size = 4;\n let index_size = 16 * index_shape.reduce((a, b) => a * b, 1);\n let bytes = await get_range(shard_path, {\n suffixLength: index_size + checksum_size,\n });\n index = cache[shard_path] = bytes\n ? await index_codec.decode(bytes)\n : null;\n }\n if (index === null) {\n return undefined;\n }\n let { data, shape, stride } = index;\n let linear_offset = chunk_coord\n .map((d, i) => d % shape[i])\n .reduce((acc, sel, idx) => acc + sel * stride[idx], 0);\n let offset = data[linear_offset];\n let length = data[linear_offset + 1];\n // write null chunk when 2^64-1 indicates fill value\n if (offset === MAX_BIG_UINT && length === MAX_BIG_UINT) {\n return undefined;\n }\n return get_range(shard_path, {\n offset: Number(offset),\n length: Number(length),\n });\n };\n}\n","import { create_codec_pipeline } from \"./codecs.js\";\nimport { create_sharded_chunk_getter } from \"./codecs/sharding.js\";\nimport { is_dtype, is_sharding_codec, } from \"./util.js\";\nimport { create_chunk_key_encoder, ensure_correct_scalar, get_array_order, get_ctr, get_strides, } from \"./util.js\";\nexport class Location {\n store;\n path;\n constructor(store, path = \"/\") {\n this.store = store;\n this.path = path;\n }\n resolve(path) {\n // reuse URL resolution logic built into the browser\n // handles relative paths, absolute paths, etc.\n let root = new URL(`file://${this.path.endsWith(\"/\") ? this.path : `${this.path}/`}`);\n return new Location(this.store, new URL(path, root).pathname);\n }\n}\nexport function root(store) {\n return new Location(store ?? new Map());\n}\nexport class Group extends Location {\n kind = \"group\";\n #metadata;\n constructor(store, path, metadata) {\n super(store, path);\n this.#metadata = metadata;\n }\n get attrs() {\n return this.#metadata.attributes;\n }\n}\nconst CONTEXT_MARKER = Symbol(\"zarrita.context\");\nexport function get_context(obj) {\n return obj[CONTEXT_MARKER];\n}\nfunction create_context(location, metadata) {\n let { configuration } = metadata.codecs.find(is_sharding_codec) ?? {};\n let shared_context = {\n encode_chunk_key: create_chunk_key_encoder(metadata.chunk_key_encoding),\n TypedArray: get_ctr(metadata.data_type),\n fill_value: metadata.fill_value,\n };\n if (configuration) {\n let native_order = get_array_order(configuration.codecs);\n return {\n ...shared_context,\n kind: \"sharded\",\n chunk_shape: configuration.chunk_shape,\n codec: create_codec_pipeline({\n data_type: metadata.data_type,\n shape: configuration.chunk_shape,\n codecs: configuration.codecs,\n }),\n get_strides(shape, order) {\n return get_strides(shape, order ?? native_order);\n },\n get_chunk_bytes: create_sharded_chunk_getter(location, metadata.chunk_grid.configuration.chunk_shape, shared_context.encode_chunk_key, configuration),\n };\n }\n let native_order = get_array_order(metadata.codecs);\n return {\n ...shared_context,\n kind: \"regular\",\n chunk_shape: metadata.chunk_grid.configuration.chunk_shape,\n codec: create_codec_pipeline({\n data_type: metadata.data_type,\n shape: metadata.chunk_grid.configuration.chunk_shape,\n codecs: metadata.codecs,\n }),\n get_strides(shape, order) {\n return get_strides(shape, order ?? native_order);\n },\n async get_chunk_bytes(chunk_coords, options) {\n let chunk_key = shared_context.encode_chunk_key(chunk_coords);\n let chunk_path = location.resolve(chunk_key).path;\n return location.store.get(chunk_path, options);\n },\n };\n}\nexport class Array extends Location {\n kind = \"array\";\n #metadata;\n [CONTEXT_MARKER];\n constructor(store, path, metadata) {\n super(store, path);\n this.#metadata = {\n ...metadata,\n fill_value: ensure_correct_scalar(metadata),\n };\n this[CONTEXT_MARKER] = create_context(this, metadata);\n }\n get attrs() {\n return this.#metadata.attributes;\n }\n get shape() {\n return this.#metadata.shape;\n }\n get chunks() {\n return this[CONTEXT_MARKER].chunk_shape;\n }\n get dtype() {\n return this.#metadata.data_type;\n }\n async getChunk(chunk_coords, options) {\n let context = this[CONTEXT_MARKER];\n let maybe_bytes = await context.get_chunk_bytes(chunk_coords, options);\n if (!maybe_bytes) {\n let size = context.chunk_shape.reduce((a, b) => a * b, 1);\n let data = new context.TypedArray(size);\n // @ts-expect-error: TS can't infer that `fill_value` is union (assumes never) but this is ok\n data.fill(context.fill_value);\n return {\n data,\n shape: context.chunk_shape,\n stride: context.get_strides(context.chunk_shape),\n };\n }\n return context.codec.decode(maybe_bytes);\n }\n /**\n * A helper method to narrow `zarr.Array` Dtype.\n *\n * ```typescript\n * let arr: zarr.Array<DataType, FetchStore> = zarr.open(store, { kind: \"array\" });\n *\n * // Option 1: narrow by scalar type (e.g. \"bool\", \"raw\", \"bigint\", \"number\")\n * if (arr.is(\"bigint\")) {\n * // zarr.Array<\"int64\" | \"uint64\", FetchStore>\n * }\n *\n * // Option 3: exact match\n * if (arr.is(\"float32\")) {\n * // zarr.Array<\"float32\", FetchStore, \"/\">\n * }\n * ```\n */\n is(query) {\n return is_dtype(this.dtype, query);\n }\n}\n","import { KeyError, NodeNotFoundError } from \"./errors.js\";\nimport { Array, Group, Location } from \"./hierarchy.js\";\nimport { ensure_correct_scalar, json_decode_object, v2_to_v3_array_metadata, v2_to_v3_group_metadata, } from \"./util.js\";\nlet VERSION_COUNTER = create_version_counter();\nfunction create_version_counter() {\n let version_counts = new WeakMap();\n function get_counts(store) {\n let counts = version_counts.get(store) ?? { v2: 0, v3: 0 };\n version_counts.set(store, counts);\n return counts;\n }\n return {\n increment(store, version) {\n get_counts(store)[version] += 1;\n },\n version_max(store) {\n let counts = get_counts(store);\n return counts.v3 > counts.v2 ? \"v3\" : \"v2\";\n },\n };\n}\nasync function load_attrs(location) {\n let meta_bytes = await location.store.get(location.resolve(\".zattrs\").path);\n if (!meta_bytes)\n return {};\n return json_decode_object(meta_bytes);\n}\nasync function open_v2(location, options = {}) {\n let loc = \"store\" in location ? location : new Location(location);\n let attrs = {};\n if (options.attrs ?? true)\n attrs = await load_attrs(loc);\n if (options.kind === \"array\")\n return open_array_v2(loc, attrs);\n if (options.kind === \"group\")\n return open_group_v2(loc, attrs);\n return open_array_v2(loc, attrs).catch((err) => {\n if (err instanceof NodeNotFoundError)\n return open_group_v2(loc, attrs);\n throw err;\n });\n}\nasync function open_array_v2(location, attrs) {\n let { path } = location.resolve(\".zarray\");\n let meta = await location.store.get(path);\n if (!meta) {\n throw new NodeNotFoundError(\"v2 array\", {\n cause: new KeyError(path),\n });\n }\n VERSION_COUNTER.increment(location.store, \"v2\");\n return new Array(location.store, location.path, v2_to_v3_array_metadata(json_decode_object(meta), attrs));\n}\nasync function open_group_v2(location, attrs) {\n let { path } = location.resolve(\".zgroup\");\n let meta = await location.store.get(path);\n if (!meta) {\n throw new NodeNotFoundError(\"v2 group\", {\n cause: new KeyError(path),\n });\n }\n VERSION_COUNTER.increment(location.store, \"v2\");\n return new Group(location.store, location.path, v2_to_v3_group_metadata(json_decode_object(meta), attrs));\n}\nasync function _open_v3(location) {\n let { store, path } = location.resolve(\"zarr.json\");\n let meta = await location.store.get(path);\n if (!meta) {\n throw new NodeNotFoundError(\"v3 array or group\", {\n cause: new KeyError(path),\n });\n }\n let meta_doc = json_decode_object(meta);\n if (meta_doc.node_type === \"array\") {\n meta_doc.fill_value = ensure_correct_scalar(meta_doc);\n }\n return meta_doc.node_type === \"array\"\n ? new Array(store, location.path, meta_doc)\n : new Group(store, location.path, meta_doc);\n}\nasync function open_v3(location, options = {}) {\n let loc = \"store\" in location ? location : new Location(location);\n let node = await _open_v3(loc);\n VERSION_COUNTER.increment(loc.store, \"v3\");\n if (options.kind === undefined)\n return node;\n if (options.kind === \"array\" && node instanceof Array)\n return node;\n if (options.kind === \"group\" && node instanceof Group)\n return node;\n let kind = node instanceof Array ? \"array\" : \"group\";\n throw new Error(`Expected node of kind ${options.kind}, found ${kind}.`);\n}\nexport async function open(location, options = {}) {\n let store = \"store\" in location ? location.store : location;\n let version_max = VERSION_COUNTER.version_max(store);\n // Use the open function for the version with the most successful opens.\n // Note that here we use the dot syntax to access the open functions\n // because this enables us to use vi.spyOn during testing.\n let open_primary = version_max === \"v2\" ? open.v2 : open.v3;\n let open_secondary = version_max === \"v2\" ? open.v3 : open.v2;\n return open_primary(location, options).catch((err) => {\n if (err instanceof NodeNotFoundError) {\n return open_secondary(location, options);\n }\n throw err;\n });\n}\nopen.v2 = open_v2;\nopen.v3 = open_v3;\n","export function strip_prefix(path) {\n // @ts-expect-error - TS can't infer this type correctly\n return path.slice(1);\n}\nexport function uri2href(url) {\n let [protocol, rest] = (typeof url === \"string\" ? url : url.href).split(\"://\");\n if (protocol === \"https\" || protocol === \"http\") {\n return url;\n }\n if (protocol === \"gc\") {\n return `https://storage.googleapis.com/${rest}`;\n }\n if (protocol === \"s3\") {\n return `https://s3.amazonaws.com/${rest}`;\n }\n throw Error(`Protocol not supported, got: ${JSON.stringify(protocol)}`);\n}\nexport function fetch_range(url, offset, length, opts = {}) {\n if (offset !== undefined && length !== undefined) {\n // merge request opts\n opts = {\n ...opts,\n headers: {\n ...opts.headers,\n Range: `bytes=${offset}-${offset + length - 1}`,\n },\n };\n }\n return fetch(url, opts);\n}\nexport function merge_init(storeOverrides, requestOverrides) {\n // Request overrides take precedence over storeOverrides.\n return {\n ...storeOverrides,\n ...requestOverrides,\n headers: {\n ...storeOverrides.headers,\n ...requestOverrides.headers,\n },\n };\n}\n","import { fetch_range, merge_init } from \"./util.js\";\nfunction resolve(root, path) {\n const base = typeof root === \"string\" ? new URL(root) : root;\n if (!base.pathname.endsWith(\"/\")) {\n // ensure trailing slash so that base is resolved as _directory_\n base.pathname += \"/\";\n }\n const resolved = new URL(path.slice(1), base);\n // copy search params to new URL\n resolved.search = base.search;\n return resolved;\n}\nasync function handle_response(response) {\n if (response.status === 404) {\n return undefined;\n }\n if (response.status === 200 || response.status === 206) {\n return new Uint8Array(await response.arrayBuffer());\n }\n throw new Error(`Unexpected response status ${response.status} ${response.statusText}`);\n}\nasync function fetch_suffix(url, suffix_length, init, use_suffix_request) {\n if (use_suffix_request) {\n return fetch(url, {\n ...init,\n headers: { ...init.headers, Range: `bytes=-${suffix_length}` },\n });\n }\n let response = await fetch(url, { ...init, method: \"HEAD\" });\n if (!response.ok) {\n // will be picked up by handle_response\n return response;\n }\n let content_length = response.headers.get(\"Content-Length\");\n let length = Number(content_length);\n return fetch_range(url, length - suffix_length, length, init);\n}\n/**\n * Readonly store based in the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n * Must polyfill `fetch` for use in Node.js.\n *\n * ```typescript\n * import * as zarr from \"@zarrita/core\";\n * const store = new FetchStore(\"http://localhost:8080/data.zarr\");\n * const arr = await zarr.get(store, { kind: \"array\" });\n * ```\n */\nclass FetchStore {\n url;\n #overrides;\n #use_suffix_request;\n constructor(url, options = {}) {\n this.url = url;\n this.#overrides = options.overrides ?? {};\n this.#use_suffix_request = options.useSuffixRequest ?? false;\n }\n #merge_init(overrides) {\n return merge_init(this.#overrides, overrides);\n }\n async get(key, options = {}) {\n let href = resolve(this.url, key).href;\n let response = await fetch(href, this.#merge_init(options));\n return handle_response(response);\n }\n async getRange(key, range, options = {}) {\n let url = resolve(this.url, key);\n let init = this.#merge_init(options);\n let response;\n if (\"suffixLength\" in range) {\n response = await fetch_suffix(url, range.suffixLength, init, this.#use_suffix_request);\n }\n else {\n response = await fetch_range(url, range.offset, range.length, init);\n }\n return handle_response(response);\n }\n}\nexport default FetchStore;\n","/** Similar to python's `range` function. Supports positive ranges only. */\nexport function* range(start, stop, step = 1) {\n if (stop === undefined) {\n stop = start;\n start = 0;\n }\n for (let i = start; i < stop; i += step) {\n yield i;\n }\n}\n/**\n * python-like itertools.product generator\n * https://gist.github.com/cybercase/db7dde901d7070c98c48\n */\nexport function* product(...iterables) {\n if (iterables.length === 0) {\n return;\n }\n // make a list of iterators from the iterables\n const iterators = iterables.map((it) => it[Symbol.iterator]());\n const results = iterators.map((it) => it.next());\n if (results.some((r) => r.done)) {\n throw new Error(\"Input contains an empty iterator.\");\n }\n for (let i = 0;;) {\n if (results[i].done) {\n // reset the current iterator\n iterators[i] = iterables[i][Symbol.iterator]();\n results[i] = iterators[i].next();\n // advance, and exit if we've reached the end\n if (++i >= iterators.length) {\n return;\n }\n }\n else {\n // @ts-expect-error - TS can't infer this\n yield results.map(({ value }) => value);\n i = 0;\n }\n results[i] = iterators[i].next();\n }\n}\n// https://github.com/python/cpython/blob/263c0dd16017613c5ea2fbfc270be4de2b41b5ad/Objects/sliceobject.c#L376-L519\nexport function slice_indices({ start, stop, step }, length) {\n if (step === 0) {\n throw new Error(\"slice step cannot be zero\");\n }\n step = step ?? 1;\n const step_is_negative = step < 0;\n /* Find lower and upper bounds for start and stop. */\n const [lower, upper] = step_is_negative ? [-1, length - 1] : [0, length];\n /* Compute start. */\n if (start === null) {\n start = step_is_negative ? upper : lower;\n }\n else {\n if (start < 0) {\n start += length;\n if (start < lower) {\n start = lower;\n }\n }\n else if (start > upper) {\n start = upper;\n }\n }\n /* Compute stop. */\n if (stop === null) {\n stop = step_is_negative ? lower : upper;\n }\n else {\n if (stop < 0) {\n stop += length;\n if (stop < lower) {\n stop = lower;\n }\n }\n else if (stop > upper) {\n stop = upper;\n }\n }\n return [start, stop, step];\n}\nexport function slice(start, stop, step = null) {\n if (stop === undefined) {\n stop = start;\n start = null;\n }\n return {\n start,\n stop,\n step,\n };\n}\n/** Built-in \"queue\" for awaiting promises. */\nexport function create_queue() {\n const promises = [];\n return {\n add: (fn) => promises.push(fn()),\n onIdle: () => Promise.all(promises),\n };\n}\n","import { product, range, slice, slice_indices } from \"./util.js\";\nexport class IndexError extends Error {\n constructor(msg) {\n super(msg);\n this.name = \"IndexError\";\n }\n}\nfunction err_too_many_indices(selection, shape) {\n throw new IndexError(`too many indicies for array; expected ${shape.length}, got ${selection.length}`);\n}\nfunction err_boundscheck(dim_len) {\n throw new IndexError(`index out of bounds for dimension with length ${dim_len}`);\n}\nfunction err_negative_step() {\n throw new IndexError(\"only slices with step >= 1 are supported\");\n}\nfunction check_selection_length(selection, shape) {\n if (selection.length > shape.length) {\n err_too_many_indices(selection, shape);\n }\n}\nexport function normalize_integer_selection(dim_sel, dim_len) {\n // normalize type to int\n dim_sel = Math.trunc(dim_sel);\n // handle wraparound\n if (dim_sel < 0) {\n dim_sel = dim_len + dim_sel;\n }\n // handle out of bounds\n if (dim_sel >= dim_len || dim_sel < 0) {\n err_boundscheck(dim_len);\n }\n return dim_sel;\n}\nclass IntDimIndexer {\n dim_sel;\n dim_len;\n dim_chunk_len;\n nitems;\n constructor({ dim_sel, dim_len, dim_chunk_len }) {\n // normalize\n dim_sel = normalize_integer_selection(dim_sel, dim_len);\n // store properties\n this.dim_sel = dim_sel;\n this.dim_len = dim_len;\n this.dim_chunk_len = dim_chunk_len;\n this.nitems = 1;\n }\n *[Symbol.iterator]() {\n const dim_chunk_ix = Math.floor(this.dim_sel / this.dim_chunk_len);\n const dim_offset = dim_chunk_ix * this.dim_chunk_len;\n const dim_chunk_sel = this.dim_sel - dim_offset;\n yield { dim_chunk_ix, dim_chunk_sel };\n }\n}\nclass SliceDimIndexer {\n start;\n stop;\n step;\n dim_len;\n dim_chunk_len;\n nitems;\n nchunks;\n constructor({ dim_sel, dim_len, dim_chunk_len }) {\n // normalize\n const [start, stop, step] = slice_indices(dim_sel, dim_len);\n this.start = start;\n this.stop = stop;\n this.step = step;\n if (this.step < 1)\n err_negative_step();\n // store properties\n this.dim_len = dim_len;\n this.dim_chunk_len = dim_chunk_len;\n this.nitems = Math.max(0, Math.ceil((this.stop - this.start) / this.step));\n this.nchunks = Math.ceil(this.dim_len / this.dim_chunk_len);\n }\n *[Symbol.iterator]() {\n // figure out the range of chunks we need to visit\n const dim_chunk_ix_from = Math.floor(this.start / this.dim_chunk_len);\n const dim_chunk_ix_to = Math.ceil(this.stop / this.dim_chunk_len);\n for (const dim_chunk_ix of range(dim_chunk_ix_from, dim_chunk_ix_to)) {\n // compute offsets for chunk within overall array\n const dim_offset = dim_chunk_ix * this.dim_chunk_len;\n const dim_limit = Math.min(this.dim_len, (dim_chunk_ix + 1) * this.dim_chunk_len);\n // determine chunk length, accounting for trailing chunk\n const dim_chunk_len = dim_limit - dim_offset;\n let dim_out_offset = 0;\n let dim_chunk_sel_start = 0;\n if (this.start < dim_offset) {\n // selection start before current chunk\n const remainder = (dim_offset - this.start) % this.step;\n if (remainder)\n dim_chunk_sel_start += this.step - remainder;\n // compute number of previous items, provides offset into output array\n dim_out_offset = Math.ceil((dim_offset - this.start) / this.step);\n }\n else {\n // selection starts within current chunk\n dim_chunk_sel_start = this.start - dim_offset;\n }\n // selection starts within current chunk if true,\n // otherwise selection ends after current chunk.\n const dim_chunk_sel_stop = this.stop > dim_limit ? dim_chunk_len : this.stop - dim_offset;\n const dim_chunk_sel = [\n dim_chunk_sel_start,\n dim_chunk_sel_stop,\n this.step,\n ];\n const dim_chunk_nitems = Math.ceil((dim_chunk_sel_stop - dim_chunk_sel_start) / this.step);\n const dim_out_sel = [\n dim_out_offset,\n dim_out_offset + dim_chunk_nitems,\n 1,\n ];\n yield { dim_chunk_ix, dim_chunk_sel, dim_out_sel };\n }\n }\n}\nexport function normalize_selection(selection, shape) {\n let normalized = [];\n if (selection === null) {\n normalized = shape.map((_) => slice(null));\n }\n else if (Array.isArray(selection)) {\n normalized = selection.map((s) => s ?? slice(null));\n }\n check_selection_length(normalized, shape);\n return normalized;\n}\nexport class BasicIndexer {\n dim_indexers;\n shape;\n constructor({ selection, shape, chunk_shape }) {\n // setup per-dimension indexers\n this.dim_indexers = normalize_selection(selection, shape).map((dim_sel, i) => {\n return new (typeof dim_sel === \"number\" ? IntDimIndexer : SliceDimIndexer)({\n // @ts-expect-error ts inference not strong enough to know correct chunk\n dim_sel: dim_sel,\n dim_len: shape[i],\n dim_chunk_len: chunk_shape[i],\n });\n });\n this.shape = this.dim_indexers\n .filter((ixr) => ixr instanceof SliceDimIndexer)\n .map((sixr) => sixr.nitems);\n }\n *[Symbol.iterator]() {\n for (const dim_projections of product(...this.dim_indexers)) {\n const chunk_coords = dim_projections.map((p) => p.dim_chunk_ix);\n const mapping = dim_projections.map((p) => {\n if (\"dim_out_sel\" in p) {\n return { from: p.dim_chunk_sel, to: p.dim_out_sel };\n }\n return { from: p.dim_chunk_sel, to: null };\n });\n yield { chunk_coords, mapping };\n }\n }\n}\n","import { _internal_get_array_context } from \"@zarrita/core\";\nimport { BasicIndexer } from \"./indexer.js\";\nimport { create_queue } from \"./util.js\";\nfunction unwrap(arr, idx) {\n return (\"get\" in arr ? arr.get(idx) : arr[idx]);\n}\nexport async function get(arr, selection, opts, setter) {\n let context = _internal_get_array_context(arr);\n let indexer = new BasicIndexer({\n selection,\n shape: arr.shape,\n chunk_shape: arr.chunks,\n });\n let out = setter.prepare(new context.TypedArray(indexer.shape.reduce((a, b) => a * b, 1)), indexer.shape, context.get_strides(indexer.shape, opts.order));\n let queue = opts.create_queue?.() ?? create_queue();\n for (const { chunk_coords, mapping } of indexer) {\n queue.add(async () => {\n let { data, shape, stride } = await arr.getChunk(chunk_coords, opts.opts);\n let chunk = setter.prepare(data, shape, stride);\n setter.set_from_chunk(out, chunk, mapping);\n });\n }\n await queue.onIdle();\n // If the final out shape is empty, we just return a scalar.\n // @ts-expect-error - TS can't narrow this conditional type\n return indexer.shape.length === 0 ? unwrap(out.data, 0) : out;\n}\n","import { get as get_with_setter } from \"./get.js\";\nimport { set as set_with_setter } from \"./set.js\";\n/** A 1D \"view\" of an array that can be used to set values in the array. */\nfunction object_array_view(arr, offset = 0, size) {\n let length = size ?? arr.length - offset;\n return {\n length,\n subarray(from, to = length) {\n return object_array_view(arr, offset + from, to - from);\n },\n set(data, start = 0) {\n for (let i = 0; i < data.length; i++) {\n arr[offset + start + i] = data.get(i);\n }\n },\n get(index) {\n return arr[offset + index];\n },\n };\n}\n/**\n * Convert a chunk to a Uint8Array that can be used with the binary\n * set functions. This is necessary because the binary set functions\n * require a contiguous block of memory, and allows us to support more than\n * just the browser's TypedArray objects.\n *\n * WARNING: This function is not meant to be used directly and is NOT type-safe.\n * In the case of `Array` instances, it will return a `object_array_view` of\n * the underlying, which is supported by our binary set functions.\n */\nfunction compat_chunk(arr) {\n if (globalThis.Array.isArray(arr.data)) {\n return {\n // @ts-expect-error\n data: object_array_view(arr.data),\n stride: arr.stride,\n bytes_per_element: 1,\n };\n }\n return {\n data: new Uint8Array(arr.data.buffer, arr.data.byteOffset, arr.data.byteLength),\n stride: arr.stride,\n bytes_per_element: arr.data.BYTES_PER_ELEMENT,\n };\n}\n/** Hack to get the constructor of a typed array constructor from an existing TypedArray. */\nfunction get_typed_array_constructor(arr) {\n if (\"chars\" in arr) {\n // our custom TypedArray needs to bind the number of characters per\n // element to the constructor.\n return arr.constructor.bind(null, arr.chars);\n }\n return arr.constructor;\n}\n/**\n * Convert a scalar to a Uint8Array that can be used with the binary\n * set functions. This is necessary because the binary set functions\n * require a contiguous block of memory, and allows us to support more\n * than just the browser's TypedArray objects.\n *\n * WARNING: This function is not meant to be used directly and is NOT type-safe.\n * In the case of `Array` instances, it will return a `object_array_view` of\n * the scalar, which is supported by our binary set functions.\n */\nfunction compat_scalar(arr, value) {\n if (globalThis.Array.isArray(arr.data)) {\n // @ts-expect-error\n return object_array_view([value]);\n }\n let TypedArray = get_typed_array_constructor(arr.data);\n // @ts-expect-error - value is a scalar and matches\n let data = new TypedArray([value]);\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n}\nexport const setter = {\n prepare(data, shape, stride) {\n return { data, shape, stride };\n },\n set_scalar(dest, sel, value) {\n let view = compat_chunk(dest);\n set_scalar_binary(view, sel, compat_scalar(dest, value), view.bytes_per_element);\n },\n set_from_chunk(dest, src, projections) {\n let view = compat_chunk(dest);\n set_from_chunk_binary(view, compat_chunk(src), view.bytes_per_element, projections);\n },\n};\n/** @category Utility */\nexport async function get(arr, selection = null, opts = {}) {\n return get_with_setter(arr, selection, opts, setter);\n}\n/** @category Utility */\nexport async function set(arr, selection, value, opts = {}) {\n return set_with_setter(arr, selection, value, opts, setter);\n}\nfunction indices_len(start, stop, step) {\n if (step < 0 && stop < start) {\n return Math.floor((start - stop - 1) / -step) + 1;\n }\n if (start < stop)\n return Math.floor((stop - start - 1) / step) + 1;\n return 0;\n}\nfunction set_scalar_binary(out, out_selection, value, bytes_per_element) {\n if (out_selection.length === 0) {\n out.data.set(value, 0);\n return;\n }\n const [slice, ...slices] = out_selection;\n const [curr_stride, ...stride] = out.stride;\n if (typeof slice === \"number\") {\n const data = out.data.subarray(curr_stride * slice * bytes_per_element);\n set_scalar_binary({ data, stride }, slices, value, bytes_per_element);\n return;\n }\n const [from, to, step] = slice;\n const len = indices_len(from, to, step);\n if (slices.length === 0) {\n for (let i = 0; i < len; i++) {\n out.data.set(value, curr_stride * (from + step * i) * bytes_per_element);\n }\n return;\n }\n for (let i = 0; i < len; i++) {\n const data = out.data.subarray(curr_stride * (from + step * i) * bytes_per_element);\n set_scalar_binary({ data, stride }, slices, value, bytes_per_element);\n }\n}\nfunction set_from_chunk_binary(dest, src, bytes_per_element, projections) {\n const [proj, ...projs] = projections;\n const [dstride, ...dstrides] = dest.stride;\n const [sstride, ...sstrides] = src.stride;\n if (proj.from === null) {\n if (projs.length === 0) {\n dest.data.set(src.data.subarray(0, bytes_per_element), proj.to * bytes_per_element);\n return;\n }\n set_from_chunk_binary({\n data: dest.data.subarray(dstride * proj.to * bytes_per_element),\n stride: dstrides,\n }, src, bytes_per_element, projs);\n return;\n }\n if (proj.to === null) {\n if (projs.length === 0) {\n let offset = proj.from * bytes_per_element;\n dest.data.set(src.data.subarray(offset, offset + bytes_per_element), 0);\n return;\n }\n set_from_chunk_binary(dest, {\n data: src.data.subarray(sstride * proj.from * bytes_per_element),\n stride: sstrides,\n }, bytes_per_element, projs);\n return;\n }\n const [from, to, step] = proj.to;\n const [sfrom, _, sstep] = proj.from;\n const len = indices_len(from, to, step);\n if (projs.length === 0) {\n // NB: we have a contiguous block of memory\n // so we can just copy over all the data at once.\n if (step === 1 && sstep === 1 && dstride === 1 && sstride === 1) {\n let offset = sfrom * bytes_per_element;\n let size = len * bytes_per_element;\n dest.data.set(src.data.subarray(offset, offset + size), from * bytes_per_element);\n return;\n }\n // Otherwise, we have to copy over each element individually.\n for (let i = 0; i < len; i++) {\n let offset = sstride * (sfrom + sstep * i) * bytes_per_element;\n dest.data.set(src.data.subarray(offset, offset + bytes_per_element), dstride * (from + step * i) * bytes_per_element);\n }\n return;\n }\n for (let i = 0; i < len; i++) {\n set_from_chunk_binary({\n data: dest.data.subarray(dstride * (from + i * step) * bytes_per_element),\n stride: dstrides,\n }, {\n data: src.data.subarray(sstride * (sfrom + i * sstep) * bytes_per_element),\n stride: sstrides,\n }, bytes_per_element, projs);\n }\n}\n","// This file is copied from https://github.com/manzt/zarrita.js/pull/161\n\nimport type { AbsolutePath, AsyncReadable } from \"@zarrita/storage\";\n\n/**\n * Get a file handle to a file in a directory.\n *\n * @param root - A root directory from the Web File System API.\n * @param path - A key to a file in the root directory.\n * @returns A file handle to the file.\n */\nasync function resolveFileHandleForPath(\n root: FileSystemDirectoryHandle,\n path: string\n): Promise<FileSystemFileHandle> {\n const dirs = path.split(\"/\");\n const fname = dirs.pop();\n if (!fname) {\n throw new Error(\"Invalid path\");\n }\n for (const dir of dirs) {\n root = await root.getDirectoryHandle(dir);\n }\n return root.getFileHandle(fname);\n}\n\n/**\n * A store for zarrita based on the Web File System API.\n *\n * Note: usage requires prompting the user to select a directory to grant\n * access to the Web File System API.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/File_System_API}\n *\n * @example\n * ```js\n * import * as zarr from \"zarrita\";\n * import WebFileSystemStore from \"@zarrita/storage/web-fs\";\n *\n * let directoryHandle = await globalThis.showDirectoryPicker();\n * let store = new WebFileSystemStore(directoryHandle);\n * let root = await zarr.root(store);\n * let arr = await zarr.open(root.resolve(\"/foo\"), { kind: \"array\" });\n * ```\n */\nclass WebFileSystemStore implements AsyncReadable {\n #root: FileSystemDirectoryHandle;\n\n constructor(root: FileSystemDirectoryHandle) {\n this.#root = root;\n }\n\n get directoryHandle(): FileSystemDirectoryHandle {\n return this.#root;\n }\n\n async get(key: AbsolutePath): Promise<Uint8Array | undefined> {\n const fh = await resolveFileHandleForPath(this.#root, key.slice(1)).catch(\n () => {\n // TODO: better error handling\n // I believe a missing file will trigger an error here, which we should explicitly\n // catch and return `undefined`\n return undefined;\n }\n );\n if (!fh) {\n return undefined;\n }\n const file = await fh.getFile();\n const buffer = await file.arrayBuffer();\n return new Uint8Array(buffer);\n }\n}\n\nexport default WebFileSystemStore;\n","import * as zarr from \"zarrita\";\nimport { Location } from \"@zarrita/core\";\nimport { Readable } from \"@zarrita/storage\";\nimport FetchStore from \"@zarrita/storage/fetch\";\nimport WebFileSystemStore from \"./web_file_system_store\";\n\nexport type Version = \"v2\" | \"v3\";\n\nexport type ZarrArrayParams = {\n arrayPath: string;\n zarrVersion: Version | undefined;\n} & (\n | {\n type: \"fetch\";\n url: string;\n fetchOptions?: {\n overrides?: RequestInit;\n useSuffixRequest?: boolean;\n };\n }\n | {\n type: \"filesystem\";\n directoryHandle: FileSystemDirectoryHandle;\n path: string;\n }\n);\n\nexport async function openGroup(\n location: zarr.Location<Readable>,\n version?: Version\n): Promise<zarr.Group<Readable>> {\n if (version === \"v2\") {\n try {\n return zarr.open.v2(location, { kind: \"group\", attrs: true });\n } catch {\n throw new Error(`Failed to open Zarr v2 group at ${location}`);\n }\n }\n if (version === \"v3\") {\n try {\n return zarr.open.v3(location, { kind: \"group\" });\n } catch {\n throw new Error(`Failed to open Zarr v3 group at ${location}`);\n }\n }\n try {\n return zarr.open(location, { kind: \"group\" });\n } catch {\n throw new Error(`Failed to open Zarr group at ${location}`);\n }\n}\n\nexport async function openArray(\n location: zarr.Location<Readable>,\n version?: Version\n): Promise<zarr.Array<zarr.DataType, Readable>> {\n if (version === \"v2\") {\n try {\n return zarr.open.v2(location, { kind: \"array\", attrs: false });\n } catch {\n throw new Error(`Failed to open Zarr v2 array at ${location}`);\n }\n }\n if (version === \"v3\") {\n try {\n return zarr.open.v3(location, { kind: \"array\" });\n } catch {\n throw new Error(`Failed to open Zarr v3 array at ${location}`);\n }\n }\n try {\n return zarr.open(location, { kind: \"array\" });\n } catch {\n throw new Error(`Failed to open Zarr array at ${location}`);\n }\n}\n\nexport async function openArrayFromParams(\n params: ZarrArrayParams\n): Promise<zarr.Array<zarr.DataType, Readable>> {\n let rootLocation: Location<Readable>;\n\n switch (params.type) {\n case \"fetch\": {\n rootLocation = new Location(\n new FetchStore(params.url, params.fetchOptions)\n );\n break;\n }\n case \"filesystem\": {\n rootLocation = new Location(\n new WebFileSystemStore(params.directoryHandle),\n params.path as `/${string}`\n );\n break;\n }\n default: {\n const exhaustiveCheck: never = params;\n throw new Error(`Unsupported store type: ${exhaustiveCheck}`);\n }\n }\n\n const arrayLocation = params.arrayPath\n ? rootLocation.resolve(params.arrayPath)\n : rootLocation;\n\n return openArray(arrayLocation, params.zarrVersion);\n}\n\nexport function createZarrArrayParams(\n location: Location<Readable>,\n arrayPath: string,\n zarrVersion: Version | undefined\n): ZarrArrayParams {\n if (location.store instanceof FetchStore) {\n return {\n type: \"fetch\",\n arrayPath,\n zarrVersion,\n url: (location.store as FetchStore).url.toString(),\n };\n } else if (location.store instanceof WebFileSystemStore) {\n return {\n type: \"filesystem\",\n arrayPath,\n zarrVersion,\n directoryHandle: location.store.directoryHandle,\n path: location.path,\n };\n } else {\n throw new Error(\n `Unsupported store type: ${location.store.constructor.name}`\n );\n }\n}\n","import * as zarr from \"zarrita\";\nimport { Readable } from \"@zarrita/storage\";\nimport { Logger } from \"../../utilities/logger\";\nimport { ZarrArrayParams } from \"../zarr/open\";\nimport { ZarrWorkerRequest, ZarrWorkerResponse } from \"./worker_kernel\";\n// \"inline\" import to ensure worker code works in dependent projects\n// this is a workaround for a vite limitation when building a library\n// see https://github.com/vitejs/vite/issues/11672\nimport WorkerKernel from \"./worker_kernel.ts?worker&inline\";\n\ntype PendingGetChunkRequest = {\n resolve: (value: zarr.Chunk<zarr.DataType>) => void;\n reject: (error: Error) => void;\n abortListener?: () => void;\n abortSignal?: AbortSignal;\n workerId: number;\n};\n\ntype WorkerInstance = {\n worker: Worker;\n pendingCount: number;\n workerId: number;\n};\n\nconst DEFAULT_WORKER_COUNT = Math.min(navigator.hardwareConcurrency, 8);\nlet workerPool: WorkerInstance[] = [];\nlet messageId = 0;\nlet workerId = 0;\nconst pendingMessages = new Map<number, PendingGetChunkRequest>();\nconst canceledMessages = new Set<number>();\n\nfunction getWorkerInstance(worker: Worker): WorkerInstance | undefined {\n const instance = workerPool.find((w) => w.worker === worker);\n if (!instance) {\n Logger.error(\n \"ZarrWorker\",\n \"Worker not found in pool - this should not happen\"\n );\n }\n return instance;\n}\n\nfunction handleWorkerMessage(\n e: MessageEvent<ZarrWorkerResponse>,\n worker: Worker\n): void {\n const { id, success } = e.data;\n const pending = pendingMessages.get(id);\n\n if (!pending) {\n if (canceledMessages.has(id)) {\n canceledMessages.delete(id);\n } else {\n Logger.warn(\n \"ZarrWorker\",\n `Received response for unknown message ID ${id}:`,\n e.data\n );\n }\n return;\n }\n\n pendingMessages.delete(id);\n\n if (pending.abortListener && pending.abortSignal) {\n pending.abortSignal.removeEventListener(\"abort\", pending.abortListener);\n }\n\n const workerInstance = getWorkerInstance(worker);\n if (workerInstance && workerInstance.pendingCount > 0) {\n workerInstance.pendingCount--;\n } else if (workerInstance) {\n Logger.error(\n \"ZarrWorker\",\n \"Received message but no pending tasks - this should not happen\"\n );\n }\n\n if (success && e.data.type === \"getChunk\") {\n pending.resolve(e.data.chunk);\n } else if (!success) {\n pending.reject(new Error(e.data.error || \"Unknown worker error\"));\n }\n}\n\nfunction handleWorkerError(\n error: ErrorEvent | MessageEvent,\n worker: Worker\n): void {\n if (error instanceof MessageEvent) {\n Logger.error(\n \"ZarrWorker\",\n \"Message serialization error occurred - worker remains active\"\n );\n return;\n }\n\n Logger.error(\n \"ZarrWorker\",\n `Worker failed - replacing worker and canceling its in-flight messages`,\n error.message\n );\n\n const workerInstance = getWorkerInstance(worker);\n if (workerInstance) {\n const workerIndex = workerPool.indexOf(workerInstance);\n workerPool.splice(workerIndex, 1);\n }\n\n const failedWorkerId = workerInstance?.workerId;\n if (failedWorkerId !== undefined) {\n for (const [id, pending] of pendingMessages.entries()) {\n if (pending.workerId === failedWorkerId) {\n pending.reject(new Error(`Worker error: ${error.message}`));\n pendingMessages.delete(id);\n }\n }\n }\n\n try {\n const replacementWorker = createWorker();\n workerPool.push({\n worker: replacementWorker,\n pendingCount: 0,\n workerId: workerId++,\n });\n Logger.debug(\"ZarrWorker\", \"Replacement worker created successfully\");\n } catch (err) {\n Logger.error(\"ZarrWorker\", \"Failed to create replacement worker\", err);\n }\n}\n\nfunction createWorker(): Worker {\n const worker = new WorkerKernel();\n\n worker.addEventListener(\"message\", (e) => handleWorkerMessage(e, worker));\n worker.addEventListener(\"error\", (error) => handleWorkerError(error, worker));\n worker.addEventListener(\"messageerror\", (error) =>\n handleWorkerError(error, worker)\n );\n\n return worker;\n}\n\nfunction getLeastBusyWorker(): WorkerInstance {\n if (workerPool.length === 0) {\n throw new Error(\"Worker pool is not initialized\");\n }\n return workerPool.sort((a, b) => a.pendingCount - b.pendingCount)[0];\n}\n\nasync function getChunkInWorker(\n zarrParams: ZarrArrayParams,\n chunkIndex: number[],\n options?: { signal?: AbortSignal }\n): Promise<zarr.Chunk<zarr.DataType>> {\n return new Promise((resolve, reject) => {\n const workerInstance = getLeastBusyWorker();\n\n const id = messageId++;\n const pending: PendingGetChunkRequest = {\n resolve,\n reject,\n workerId: workerInstance.workerId,\n };\n pendingMessages.set(id, pending);\n\n // set up cancellation in the worker thread if an AbortSignal is provided\n if (options?.signal) {\n const abortListener = () => {\n workerInstance.worker.postMessage({\n id: id,\n type: \"cancel\",\n } as ZarrWorkerRequest);\n\n pendingMessages.delete(id);\n canceledMessages.add(id);\n\n workerInstance.pendingCount--;\n\n reject(new DOMException(\"Operation was aborted\", \"AbortError\"));\n };\n\n if (options.signal.aborted) {\n abortListener();\n // delete now, message canceled before it was even posted\n canceledMessages.delete(id);\n return;\n }\n\n options.signal.addEventListener(\"abort\", abortListener, { once: true });\n\n pending.abortListener = abortListener;\n pending.abortSignal = options.signal;\n }\n\n workerInstance.pendingCount++;\n\n workerInstance.worker.postMessage({\n id: id,\n type: \"getChunk\",\n arrayParams: zarrParams,\n index: chunkIndex,\n } as ZarrWorkerRequest);\n });\n}\n\nfunction ensureWorkerPool(): void {\n if (workerPool.length > 0) return;\n\n try {\n for (let i = 0; i < DEFAULT_WORKER_COUNT; i++) {\n const worker = createWorker();\n workerPool.push({\n worker,\n pendingCount: 0,\n workerId: workerId++,\n });\n }\n Logger.debug(\n \"ZarrWorker\",\n `Initialized worker pool with ${workerPool.length} workers`\n );\n } catch {\n Logger.warn(\"ZarrWorker\", \"Failed to create workers - clearing pool\");\n terminateWorkerPool();\n return;\n }\n}\n\nexport async function getChunk(\n array: zarr.Array<zarr.DataType, Readable>,\n arrayParams: ZarrArrayParams,\n chunkCoords: number[],\n options?: { signal?: AbortSignal }\n): Promise<zarr.Chunk<zarr.DataType>> {\n ensureWorkerPool();\n try {\n return await getChunkInWorker(arrayParams, chunkCoords, options);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw error;\n }\n\n Logger.warn(\"ZarrWorker\", \"Falling back to main thread\", error);\n const chunk = await array.getChunk(chunkCoords, options);\n\n return chunk;\n }\n}\n\nexport function terminateWorkerPool(): void {\n for (const workerInstance of workerPool) {\n workerInstance.worker.terminate();\n }\n workerPool = [];\n pendingMessages.clear();\n}\n","import * as zarr from \"zarrita\";\nimport { Slice } from \"@zarrita/indexing\";\n\nimport { Region } from \"../region\";\nimport {\n Chunk,\n SourceDimension,\n SourceDimensionMap,\n isChunkData,\n LoaderAttributes,\n ChunkData,\n ChunkDataConstructor,\n} from \"../chunk\";\nimport { isTextureUnpackRowAlignment } from \"../../objects/textures/texture\";\nimport { PromiseScheduler } from \"../promise_scheduler\";\n\nimport { Image as OmeZarrImage } from \"./0.5/image\";\n\nimport { Readable } from \"@zarrita/storage\";\nimport { ZarrArrayParams } from \"../zarr/open\";\nimport { getChunk } from \"./worker_pool\";\n\n// Implements the interface required for getting array chunks in zarrita:\n// https://github.com/manzt/zarrita.js/blob/c15c1a14e42a83516972368ac962ebdf56a6dcdb/packages/indexing/src/types.ts#L52\nexport class PromiseQueue<T> {\n private readonly promises_: Array<() => Promise<T>> = [];\n private readonly scheduler_: PromiseScheduler;\n\n constructor(scheduler: PromiseScheduler) {\n this.scheduler_ = scheduler;\n }\n\n add(promise: () => Promise<T>) {\n this.promises_.push(promise);\n }\n\n onIdle(): Promise<Array<T>> {\n return Promise.all(this.promises_.map((p) => this.scheduler_.submit(p)));\n }\n}\n\ntype OmeZarrImageLoaderProps = {\n metadata: OmeZarrImage[\"ome\"][\"multiscales\"][number];\n arrays: zarr.Array<zarr.DataType, Readable>[];\n arrayParams: ZarrArrayParams[];\n};\n\n// Loads chunks from a multiscale image implementing OME-Zarr v0.5:\n// https://ngff.openmicroscopy.org/0.5/#image-layout\nexport class OmeZarrImageLoader {\n private readonly metadata_: OmeZarrImage[\"ome\"][\"multiscales\"][number];\n private readonly arrays_: ReadonlyArray<zarr.Array<zarr.DataType, Readable>>;\n private readonly arrayParams_: ReadonlyArray<ZarrArrayParams>;\n private readonly loaderAttributes_: ReadonlyArray<LoaderAttributes>;\n private readonly dimensions_: SourceDimensionMap;\n\n constructor(props: OmeZarrImageLoaderProps) {\n this.metadata_ = props.metadata;\n this.arrays_ = props.arrays;\n this.arrayParams_ = props.arrayParams;\n this.loaderAttributes_ = getLoaderAttributes(this.metadata_, this.arrays_);\n this.dimensions_ = inferSourceDimensionMap(this.loaderAttributes_);\n }\n\n public getSourceDimensionMap(): SourceDimensionMap {\n return this.dimensions_;\n }\n\n public async loadChunkData(chunk: Chunk, signal: AbortSignal) {\n const chunkCoords: number[] = [];\n chunkCoords[this.dimensions_.x.index] = chunk.chunkIndex.x;\n chunkCoords[this.dimensions_.y.index] = chunk.chunkIndex.y;\n if (this.dimensions_.z) {\n chunkCoords[this.dimensions_.z.index] = chunk.chunkIndex.z;\n }\n if (this.dimensions_.c) {\n chunkCoords[this.dimensions_.c.index] = chunk.chunkIndex.c;\n }\n if (this.dimensions_.t) {\n chunkCoords[this.dimensions_.t.index] = chunk.chunkIndex.t;\n }\n\n const array = this.arrays_[chunk.lod];\n const arrayParams = this.arrayParams_[chunk.lod];\n const receivedChunk = await getChunk(array, arrayParams, chunkCoords, {\n signal,\n });\n\n if (!isChunkData(receivedChunk.data)) {\n throw new Error(\n `Received chunk has an unsupported data type, data=${receivedChunk.data.constructor.name}`\n );\n }\n\n validateTightlyPackedChunk(receivedChunk);\n\n const receivedShape = {\n x: receivedChunk.shape[this.dimensions_.x.index],\n y: receivedChunk.shape[this.dimensions_.y.index],\n z: this.dimensions_.z\n ? receivedChunk.shape[this.dimensions_.z.index]\n : chunk.shape.z,\n };\n\n const receivedChunkTooSmall =\n receivedShape.x < chunk.shape.x ||\n receivedShape.y < chunk.shape.y ||\n receivedShape.z < chunk.shape.z;\n\n if (receivedChunkTooSmall) {\n throw new Error(\n `Received incompatible shape for chunkIndex ${JSON.stringify(chunk.chunkIndex)} at LOD ${chunk.lod}: ` +\n `expected shape: ${JSON.stringify(chunk.shape)}, received shape: ${JSON.stringify(receivedShape)} (too small)`\n );\n }\n\n const receivedChunkHasPadding =\n receivedShape.x > chunk.shape.x ||\n receivedShape.y > chunk.shape.y ||\n receivedShape.z > chunk.shape.z;\n\n if (receivedChunkHasPadding) {\n chunk.data = this.trimChunkPadding(\n chunk,\n receivedChunk.data,\n receivedChunk.stride\n );\n } else {\n chunk.data = receivedChunk.data;\n }\n\n const rowAlignment = chunk.data.BYTES_PER_ELEMENT;\n if (!isTextureUnpackRowAlignment(rowAlignment)) {\n throw new Error(\n \"Invalid row alignment value. Possible values are 1, 2, 4, or 8\"\n );\n }\n chunk.rowAlignmentBytes = rowAlignment;\n }\n\n private trimChunkPadding(\n chunk: Chunk,\n receivedChunkData: ChunkData,\n receivedChunkStride: number[]\n ): ChunkData {\n const compactSize = chunk.shape.x * chunk.shape.y * chunk.shape.z;\n const compactData =\n new (receivedChunkData.constructor as ChunkDataConstructor)(compactSize);\n\n let offset = 0;\n const zStride = this.dimensions_.z\n ? receivedChunkStride[this.dimensions_.z.index]\n : 0;\n const yStride = receivedChunkStride[this.dimensions_.y.index];\n for (let z = 0; z < chunk.shape.z; z++) {\n const zStart = z * zStride;\n for (let y = 0; y < chunk.shape.y; y++) {\n const srcStart = zStart + y * yStride;\n const srcEnd = srcStart + chunk.shape.x;\n compactData.set(receivedChunkData.subarray(srcStart, srcEnd), offset);\n offset += chunk.shape.x;\n }\n }\n return compactData;\n }\n\n public async loadRegion(\n region: Region,\n lod: number,\n scheduler?: PromiseScheduler\n ): Promise<Chunk> {\n if (lod >= this.arrays_.length) {\n throw new Error(\n `Invalid LOD index: ${lod}. Only ${this.arrays_.length} lod(s) available`\n );\n }\n\n const attributes = this.loaderAttributes_[lod];\n const indices = this.regionToIndices(region, attributes);\n const { scale, translation } = attributes;\n const array = this.arrays_[lod];\n\n let options = {};\n if (scheduler !== undefined) {\n options = {\n create_queue: () => new PromiseQueue(scheduler),\n opts: { signal: scheduler.abortSignal },\n };\n }\n const subarray = await zarr.get(array, indices, options);\n\n if (!isChunkData(subarray.data)) {\n throw new Error(\n `Subarray has an unsupported data type, data=${subarray.data.constructor.name}`\n );\n }\n\n validateTightlyPackedChunk(subarray);\n\n if (subarray.shape.length !== 2 && subarray.shape.length !== 3) {\n throw new Error(\n `Expected to receive a 2D or 3D subarray. Instead chunk has shape ${subarray.shape}`\n );\n }\n\n const rowAlignment = subarray.data.BYTES_PER_ELEMENT;\n if (!isTextureUnpackRowAlignment(rowAlignment)) {\n throw new Error(\n \"Invalid row alignment value. Possible values are 1, 2, 4, or 8\"\n );\n }\n\n const calculateOffset = (i: number) => {\n const index = indices[i];\n if (typeof index === \"number\") {\n return index * scale[i] + translation[i];\n } else if (index.start === null) {\n return translation[i];\n }\n return index.start * scale[i] + translation[i];\n };\n\n const xOffset = calculateOffset(indices.length - 1);\n const yOffset = calculateOffset(indices.length - 2);\n\n const chunk: Chunk = {\n state: \"loaded\",\n lod: lod,\n visible: true,\n prefetch: false,\n priority: null,\n orderKey: null,\n data: subarray.data,\n shape: {\n x: subarray.shape[subarray.shape.length - 1],\n y: subarray.shape[subarray.shape.length - 2],\n z: 1,\n c: subarray.shape.length === 3 ? subarray.shape[0] : 1,\n },\n chunkIndex: { x: 0, y: 0, z: 0, c: 0, t: 0 },\n rowAlignmentBytes: rowAlignment,\n scale: {\n x: scale[indices.length - 1],\n y: scale[indices.length - 2],\n z: 1,\n },\n offset: { x: xOffset, y: yOffset, z: 0 },\n };\n return chunk;\n }\n\n public getAttributes(): ReadonlyArray<LoaderAttributes> {\n return this.loaderAttributes_;\n }\n\n private regionToIndices(\n region: Region,\n attributes: LoaderAttributes\n ): Array<Slice | number> {\n const { dimensionNames, scale, translation } = attributes;\n\n const indices: Array<Slice | number> = [];\n for (const [i, dimName] of dimensionNames.entries()) {\n const match = region.find((s) => s.dimension == dimName);\n if (!match) {\n throw new Error(`Region does not contain a slice for ${dimName}`);\n }\n let index: Slice | number;\n const regionIndex = match.index;\n if (regionIndex.type === \"full\") {\n // null slice is the complete extent of a dimension like Python's `slice(None)`.\n index = zarr.slice(null);\n } else if (regionIndex.type === \"point\") {\n index = Math.round((regionIndex.value - translation[i]) / scale[i]);\n } else {\n index = zarr.slice(\n Math.floor((regionIndex.start - translation[i]) / scale[i]),\n Math.ceil((regionIndex.stop - translation[i]) / scale[i])\n );\n }\n indices.push(index);\n }\n return indices;\n }\n}\n\nfunction getLoaderAttributes(\n image: OmeZarrImage[\"ome\"][\"multiscales\"][number],\n arrays: ReadonlyArray<zarr.Array<zarr.DataType, Readable>>\n): LoaderAttributes[] {\n const output: LoaderAttributes[] = [];\n const numAxes = image.axes.length;\n for (let i = 0; i < image.datasets.length; i++) {\n const dataset = image.datasets[i];\n const array = arrays[i];\n const scale = dataset.coordinateTransformations[0].scale;\n const translation =\n dataset.coordinateTransformations.length === 2\n ? dataset.coordinateTransformations[1].translation\n : new Array(numAxes).fill(0);\n output.push({\n dimensionNames: image.axes.map((axis) => axis.name),\n dimensionUnits: image.axes.map((axis) => axis.unit),\n chunks: array.chunks,\n shape: array.shape,\n scale,\n translation,\n });\n }\n return output;\n}\n\nfunction inferSourceDimensionMap(\n attrs: ReadonlyArray<LoaderAttributes>\n): SourceDimensionMap {\n const names = attrs[0].dimensionNames;\n\n const xIndex = findDimensionIndex(names, \"x\");\n const yIndex = findDimensionIndex(names, \"y\");\n const dims: SourceDimensionMap = {\n x: getSourceDimension(names[xIndex], xIndex, attrs),\n y: getSourceDimension(names[yIndex], yIndex, attrs),\n numLods: attrs.length,\n };\n\n const zIndex = findDimensionIndexSafe(names, \"z\");\n if (zIndex !== -1) {\n dims.z = getSourceDimension(names[zIndex], zIndex, attrs);\n }\n\n const cIndex = findDimensionIndexSafe(names, \"c\");\n if (cIndex !== -1) {\n dims.c = getSourceDimension(names[cIndex], cIndex, attrs);\n }\n\n const tIndex = findDimensionIndexSafe(names, \"t\");\n if (tIndex !== -1) {\n dims.t = getSourceDimension(names[tIndex], tIndex, attrs);\n }\n\n return dims;\n}\n\nfunction getSourceDimension(\n name: string,\n index: number,\n attrs: ReadonlyArray<LoaderAttributes>\n): SourceDimension {\n return {\n name,\n index,\n lods: attrs.map((attr) => ({\n size: attr.shape[index],\n chunkSize: attr.chunks[index],\n scale: attr.scale[index],\n translation: attr.translation[index],\n })),\n };\n}\n\nfunction compareDimensions(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\nfunction findDimensionIndex(dimensions: string[], target: string): number {\n const index = findDimensionIndexSafe(dimensions, target);\n if (index === -1) {\n throw new Error(\n `Could not find \"${target}\" dimension in [${dimensions.join(\", \")}]`\n );\n }\n return index;\n}\n\nfunction findDimensionIndexSafe(dimensions: string[], target: string): number {\n return dimensions.findIndex((d) => compareDimensions(d, target));\n}\n\nfunction validateTightlyPackedChunk(chunk: zarr.Chunk<zarr.DataType>): void {\n let stride = 1;\n for (let i = chunk.shape.length - 1; i >= 0; i--) {\n if (chunk.stride[i] !== stride) {\n throw new Error(\n `Chunk data is not tightly packed, stride=${JSON.stringify(chunk.stride)}, shape=${JSON.stringify(chunk.shape)}`\n );\n }\n stride *= chunk.shape[i];\n }\n}\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nfunction custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n var _a, _b;\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = (_b = (_a = params.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = (_b = (_a = params.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","import { z } from \"zod\";\n\n/**JSON from OME-NGFF .zattrs*/\nexport const Image = z\n .object({\n /**The multiscale datasets for this image*/\n multiscales: z\n .array(\n z.object({\n name: z.string().optional(),\n datasets: z\n .array(\n z.object({\n path: z.string(),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1),\n })\n )\n .min(1),\n version: z.literal(\"0.4\").optional(),\n axes: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n name: z.string(),\n type: z.enum([\"channel\", \"time\", \"space\"]),\n }),\n z.object({\n name: z.string(),\n type: z\n .any()\n .refine(\n (value) =>\n !z.enum([\"space\", \"time\", \"channel\"]).safeParse(value)\n .success,\n \"Invalid input: Should NOT be valid against schema\"\n )\n .optional(),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(2)\n .max(5),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n // The JSON schema and my reading of the spec is that while\n // identity is a valid transformation, it cannot be used here.\n // However, some writers write it (e.g iohub), and it has no\n // effect on the overall transformation, so we manually added\n // after generation from the schema.\n // See the following PR for more context:\n // https://github.com/ome/ngff/pull/152\n z.object({\n type: z.literal(\"identity\"),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1)\n .optional(),\n })\n )\n .min(1)\n .describe(\"The multiscale datasets for this image\"),\n omero: z\n .object({\n channels: z.array(\n z.object({\n window: z.object({\n end: z.number(),\n max: z.number(),\n min: z.number(),\n start: z.number(),\n }),\n label: z.string().optional(),\n family: z.string().optional(),\n color: z.string(),\n active: z.boolean().optional(),\n })\n ),\n // The rdefs are not in the JSON schema and are not particularly well\n // described by the specification, but are written by some tools\n // (e.g. iohub), so we manually add them.\n // See the OMERO docs for more information:\n // https://docs.openmicroscopy.org/omero/5.6.1/developers/Web/WebGateway.html#rendering-settings\n rdefs: z\n .object({\n defaultT: z.number().optional(),\n defaultZ: z.number().optional(),\n color: z.enum([\"color\", \"greyscale\"]).optional(),\n projection: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .describe(\"JSON from OME-NGFF .zattrs\");\nexport type Image = z.infer<typeof Image>;\n","import { z } from \"zod\";\n\n/**JSON from OME-NGFF .zattrs*/\nexport const Plate = z\n .object({\n plate: z\n .object({\n /**The acquisitions for this plate*/\n acquisitions: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n id: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"A unique identifier within the context of the plate\"\n ),\n /**The maximum number of fields of view for the acquisition*/\n maximumfieldcount: z\n .number()\n .int()\n .gt(0)\n .describe(\n \"The maximum number of fields of view for the acquisition\"\n )\n .optional(),\n /**The name of the acquisition*/\n name: z\n .string()\n .describe(\"The name of the acquisition\")\n .optional(),\n /**The description of the acquisition*/\n description: z\n .string()\n .describe(\"The description of the acquisition\")\n .optional(),\n /**The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n starttime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n /**The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n endtime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n })\n )\n .describe(\"The acquisitions for this plate\")\n .optional(),\n /**The version of the specification*/\n version: z\n .literal(\"0.4\")\n .describe(\"The version of the specification\")\n .optional(),\n /**The maximum number of fields per view across all wells*/\n field_count: z\n .number()\n .int()\n .gt(0)\n .describe(\"The maximum number of fields per view across all wells\")\n .optional(),\n /**The name of the plate*/\n name: z.string().describe(\"The name of the plate\").optional(),\n /**The columns of the plate*/\n columns: z\n .array(\n z.object({\n /**The column name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The column name\"),\n })\n )\n .min(1)\n .describe(\"The columns of the plate\"),\n /**The rows of the plate*/\n rows: z\n .array(\n z.object({\n /**The row name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The row name\"),\n })\n )\n .min(1)\n .describe(\"The rows of the plate\"),\n /**The wells of the plate*/\n wells: z\n .array(\n z.object({\n /**The path to the well subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+/[A-Za-z0-9]+$\"))\n .describe(\"The path to the well subgroup\"),\n /**The index of the well in the rows list*/\n rowIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the rows list\"),\n /**The index of the well in the columns list*/\n columnIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the columns list\"),\n })\n )\n .min(1)\n .describe(\"The wells of the plate\"),\n })\n .optional(),\n })\n .describe(\"JSON from OME-NGFF .zattrs\");\nexport type Plate = z.infer<typeof Plate>;\n","import { z } from \"zod\";\n\n/**JSON from OME-NGFF .zattrs*/\nexport const Well = z\n .object({\n well: z\n .object({\n /**The fields of view for this well*/\n images: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n acquisition: z\n .number()\n .int()\n .describe(\"A unique identifier within the context of the plate\")\n .optional(),\n /**The path for this field of view subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The path for this field of view subgroup\"),\n })\n )\n .min(1)\n .describe(\"The fields of view for this well\"),\n /**The version of the specification*/\n version: z\n .literal(\"0.4\")\n .describe(\"The version of the specification\")\n .optional(),\n })\n .optional(),\n })\n .describe(\"JSON from OME-NGFF .zattrs\");\nexport type Well = z.infer<typeof Well>;\n","import { z } from \"zod\";\n\n/**The zarr.json attributes key*/\nexport const Image = z\n .object({\n /**The versioned OME-Zarr Metadata namespace*/\n ome: z\n .object({\n /**The multiscale datasets for this image*/\n multiscales: z\n .array(\n z.object({\n name: z.string().optional(),\n datasets: z\n .array(\n z.object({\n path: z.string(),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error\n ? [...errors, result.error]\n : errors)(schema.safeParse(x)),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message:\n \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1),\n })\n )\n .min(1),\n axes: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n name: z.string(),\n type: z.enum([\"channel\", \"time\", \"space\"]),\n }),\n z.object({\n name: z.string(),\n type: z\n .any()\n .refine(\n (value) =>\n !z\n .enum([\"space\", \"time\", \"channel\"])\n .safeParse(value).success,\n \"Invalid input: Should NOT be valid against schema\"\n )\n .optional(),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(2)\n .max(5),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n // The JSON schema and my reading of the spec is that while\n // identity is a valid transformation, it cannot be used here.\n // However, some writers write it (e.g iohub), and it has no\n // effect on the overall transformation, so we manually added\n // after generation from the schema.\n // See the following PR for more context:\n // https://github.com/ome/ngff/pull/152\n z.object({\n type: z.literal(\"identity\"),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1)\n .optional(),\n })\n )\n .min(1)\n .describe(\"The multiscale datasets for this image\"),\n omero: z\n .object({\n channels: z.array(\n z.object({\n window: z\n .object({\n end: z.number(),\n max: z.number(),\n min: z.number(),\n start: z.number(),\n })\n .optional(),\n label: z.string().optional(),\n family: z.string().optional(),\n color: z.string().optional(),\n active: z.boolean().optional(),\n })\n ),\n // The rdefs are not in the JSON schema and are not particularly well\n // described by the specification, but are written by some tools\n // (e.g. iohub), so we manually add them.\n // See the OMERO docs for more information:\n // https://docs.openmicroscopy.org/omero/5.6.1/developers/Web/WebGateway.html#rendering-settings\n rdefs: z\n .object({\n defaultT: z.number().optional(),\n defaultZ: z.number().optional(),\n color: z.enum([\"color\", \"greyscale\"]).optional(),\n projection: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n /**The version of the OME-Zarr Metadata*/\n version: z\n .literal(\"0.5\")\n .describe(\"The version of the OME-Zarr Metadata\"),\n })\n .describe(\"The versioned OME-Zarr Metadata namespace\"),\n })\n .describe(\"The zarr.json attributes key\");\nexport type Image = z.infer<typeof Image>;\n","import { z } from \"zod\";\n\n/**The zarr.json attributes key*/\nexport const Plate = z\n .object({\n /**The versioned OME-Zarr Metadata namespace*/\n ome: z\n .object({\n plate: z.object({\n /**The acquisitions for this plate*/\n acquisitions: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n id: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"A unique identifier within the context of the plate\"\n ),\n /**The maximum number of fields of view for the acquisition*/\n maximumfieldcount: z\n .number()\n .int()\n .gt(0)\n .describe(\n \"The maximum number of fields of view for the acquisition\"\n )\n .optional(),\n /**The name of the acquisition*/\n name: z\n .string()\n .describe(\"The name of the acquisition\")\n .optional(),\n /**The description of the acquisition*/\n description: z\n .string()\n .describe(\"The description of the acquisition\")\n .optional(),\n /**The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n starttime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n /**The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n endtime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n })\n )\n .describe(\"The acquisitions for this plate\")\n .optional(),\n /**The maximum number of fields per view across all wells*/\n field_count: z\n .number()\n .int()\n .gt(0)\n .describe(\"The maximum number of fields per view across all wells\")\n .optional(),\n /**The name of the plate*/\n name: z.string().describe(\"The name of the plate\").optional(),\n /**The columns of the plate*/\n columns: z\n .array(\n z.object({\n /**The column name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The column name\"),\n })\n )\n .min(1)\n .describe(\"The columns of the plate\"),\n /**The rows of the plate*/\n rows: z\n .array(\n z.object({\n /**The row name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The row name\"),\n })\n )\n .min(1)\n .describe(\"The rows of the plate\"),\n /**The wells of the plate*/\n wells: z\n .array(\n z.object({\n /**The path to the well subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+/[A-Za-z0-9]+$\"))\n .describe(\"The path to the well subgroup\"),\n /**The index of the well in the rows list*/\n rowIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the rows list\"),\n /**The index of the well in the columns list*/\n columnIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the columns list\"),\n })\n )\n .min(1)\n .describe(\"The wells of the plate\"),\n }),\n /**The version of the OME-Zarr Metadata*/\n version: z\n .literal(\"0.5\")\n .describe(\"The version of the OME-Zarr Metadata\"),\n })\n .describe(\"The versioned OME-Zarr Metadata namespace\"),\n })\n .describe(\"The zarr.json attributes key\");\nexport type Plate = z.infer<typeof Plate>;\n","import { z } from \"zod\";\n\n/**JSON from OME-Zarr zarr.json*/\nexport const Well = z\n .object({\n /**The versioned OME-Zarr Metadata namespace*/\n ome: z\n .object({\n well: z.object({\n /**The fields of view for this well*/\n images: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n acquisition: z\n .number()\n .int()\n .describe(\n \"A unique identifier within the context of the plate\"\n )\n .optional(),\n /**The path for this field of view subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The path for this field of view subgroup\"),\n })\n )\n .min(1)\n .describe(\"The fields of view for this well\"),\n }),\n /**The version of the OME-Zarr Metadata*/\n version: z\n .literal(\"0.5\")\n .describe(\"The version of the OME-Zarr Metadata\"),\n })\n .describe(\"The versioned OME-Zarr Metadata namespace\"),\n })\n .describe(\"JSON from OME-Zarr zarr.json\");\nexport type Well = z.infer<typeof Well>;\n","import * as zarr from \"zarrita\";\nimport { Image as ImageV04 } from \"./0.4/image\";\nimport { Plate as PlateV04 } from \"./0.4/plate\";\nimport { Well as WellV04 } from \"./0.4/well\";\nimport { Image } from \"./0.5/image\";\nimport { Plate } from \"./0.5/plate\";\nimport { Well } from \"./0.5/well\";\nimport { OmeZarrImageSource } from \"./image_source\";\nimport { Version as ZarrVersion, openGroup } from \"../zarr/open\";\n\nconst versions = [\"0.4\", \"0.5\"] as const;\nconst versionsSet: ReadonlySet<string> = new Set(versions);\nexport type Version = (typeof versions)[number];\n\ntype AdaptedOme<T> = T & {\n originalVersion: Version;\n};\n\nfunction maybeGetVersion(attrs: object): Version | undefined {\n if (!(\"ome\" in attrs)) return;\n if (!(attrs.ome instanceof Object)) return;\n const ome = attrs.ome;\n if (!(\"version\" in ome)) return;\n if (typeof ome.version !== \"string\") return;\n if (!versionsSet.has(ome.version)) return;\n return ome.version as Version;\n}\n\nfunction getVersion(attrs: object): Version {\n // From v0.5 onwards, we assume that ome.version indicates the version.\n // If it is not present or malformed, we assume it is v0.4, which is\n // the oldest format we support.\n const version = maybeGetVersion(attrs);\n if (version === undefined) return \"0.4\";\n return version;\n}\n\nexport function omeZarrToZarrVersion(\n omeVersion: Version | undefined\n): ZarrVersion | undefined {\n if (omeVersion === undefined) return undefined;\n switch (omeVersion) {\n case \"0.4\":\n return \"v2\";\n case \"0.5\":\n return \"v3\";\n }\n}\n\nfunction removeProperty<O, P extends keyof O>(obj: O, prop: P): Omit<O, P> {\n const objCopy = { ...obj };\n delete objCopy[prop];\n return objCopy;\n}\n\nexport async function loadOmeZarrPlate(\n url: string,\n version?: Version\n): Promise<AdaptedOme<Plate[\"ome\"]>> {\n const location = new zarr.Location(new zarr.FetchStore(url));\n const zarrVersion = omeZarrToZarrVersion(version);\n const group = await openGroup(location, zarrVersion);\n try {\n return parsePlate(group.attrs);\n } catch {\n throw Error(\n `Failed to parse OME-Zarr plate:\\n${JSON.stringify(group.attrs)}`\n );\n }\n}\n\nfunction parsePlate(attrs: Record<string, unknown>): AdaptedOme<Plate[\"ome\"]> {\n const version = getVersion(attrs);\n switch (version) {\n case \"0.5\":\n return {\n ...Plate.parse(attrs).ome,\n originalVersion: \"0.5\",\n };\n case \"0.4\":\n return {\n ...adaptPlateV04ToV05(PlateV04.parse(attrs)).ome,\n originalVersion: \"0.4\",\n };\n }\n}\n\nfunction adaptPlateV04ToV05(platev04: PlateV04): Plate {\n if (platev04.plate === undefined) {\n throw new Error(\"Plate metadata is missing in OME-Zarr v0.4 plate\");\n }\n const plate = removeProperty(platev04.plate, \"version\");\n return {\n ome: {\n plate,\n version: \"0.5\",\n },\n };\n}\n\nfunction adaptWellV04ToV05(wellv04: WellV04): Well {\n if (wellv04.well === undefined) {\n throw new Error(\"Well metadata is missing in OME-Zarr v0.4 well\");\n }\n const well = removeProperty(wellv04.well, \"version\");\n return {\n ome: {\n well,\n version: \"0.5\",\n },\n };\n}\n\nfunction parseWell(attrs: Record<string, unknown>): AdaptedOme<Well[\"ome\"]> {\n const version = getVersion(attrs);\n switch (version) {\n case \"0.5\":\n return {\n ...Well.parse(attrs).ome,\n originalVersion: \"0.5\",\n };\n case \"0.4\":\n return {\n ...adaptWellV04ToV05(WellV04.parse(attrs)).ome,\n originalVersion: \"0.4\",\n };\n }\n}\n\nexport async function loadOmeZarrWell(\n url: string,\n path: string,\n version?: Version\n): Promise<AdaptedOme<Well[\"ome\"]>> {\n const location = new zarr.Location(new zarr.FetchStore(url + \"/\" + path));\n const zarrVersion = omeZarrToZarrVersion(version);\n const group = await openGroup(location, zarrVersion);\n try {\n return parseWell(group.attrs);\n } catch {\n throw Error(\n `Failed to parse OME-Zarr well:\\n${JSON.stringify(group.attrs)}`\n );\n }\n}\n\nexport type OmeroMetadata = NonNullable<Image[\"ome\"][\"omero\"]>;\nexport type OmeroChannel = OmeroMetadata[\"channels\"][number];\n\nexport async function loadOmeroChannels(\n source: OmeZarrImageSource\n): Promise<OmeroChannel[]> {\n const zarrVersion = omeZarrToZarrVersion(source.version);\n const group = await openGroup(source.location, zarrVersion);\n const image = parseOmeZarrImage(group.attrs);\n return image.omero?.channels ?? [];\n}\n\nexport async function loadOmeroDefaults(\n source: OmeZarrImageSource\n): Promise<OmeroMetadata[\"rdefs\"]> {\n const zarrVersion = omeZarrToZarrVersion(source.version);\n const group = await openGroup(source.location, zarrVersion);\n const image = parseOmeZarrImage(group.attrs);\n return image.omero?.rdefs;\n}\n\nfunction adaptImageV04ToV05(imagev04: ImageV04): Image {\n return {\n ome: {\n multiscales: imagev04.multiscales,\n omero: imagev04.omero,\n version: \"0.5\",\n },\n };\n}\n\nfunction parseImage(attrs: Record<string, unknown>): AdaptedOme<Image[\"ome\"]> {\n const version = getVersion(attrs);\n switch (version) {\n case \"0.5\":\n return {\n ...Image.parse(attrs).ome,\n originalVersion: \"0.5\",\n };\n case \"0.4\":\n return {\n ...adaptImageV04ToV05(ImageV04.parse(attrs)).ome,\n originalVersion: \"0.4\",\n };\n }\n}\n\nexport function parseOmeZarrImage(\n attrs: Record<string, unknown>\n): AdaptedOme<Image[\"ome\"]> {\n try {\n return parseImage(attrs);\n } catch {\n throw Error(`Failed to parse OME-Zarr image:\\n${JSON.stringify(attrs)}`);\n }\n}\n","import { Location } from \"@zarrita/core\";\nimport { Readable } from \"@zarrita/storage\";\nimport FetchStore from \"@zarrita/storage/fetch\";\nimport {\n openArrayFromParams,\n openGroup,\n createZarrArrayParams,\n} from \"../zarr/open\";\nimport WebFileSystemStore from \"../zarr/web_file_system_store\";\nimport { OmeZarrImageLoader } from \"./image_loader\";\nimport {\n omeZarrToZarrVersion,\n parseOmeZarrImage,\n Version as OmeZarrVersion,\n} from \"./metadata_loaders\";\n\n/** Opens an OME-Zarr multiscale image Zarr group from either a URL or local directory. */\nexport class OmeZarrImageSource {\n readonly location: Location<Readable>;\n readonly version?: OmeZarrVersion;\n\n /**\n * @param url URL of Zarr root\n */\n constructor(url: string, version?: OmeZarrVersion);\n /**\n * @param directory return value of `window.showDirectoryPicker()` which gives the browser\n * permission to access a directory (only works in Chrome/Edge)\n * @param path path to image, beginning with \"/\". This argument allows the application to only\n * ask the user once for permission to the root directory\n */\n constructor(\n directory: FileSystemDirectoryHandle,\n version?: OmeZarrVersion,\n path?: `/${string}`\n );\n constructor(\n source: string | FileSystemDirectoryHandle,\n version?: OmeZarrVersion,\n path?: `/${string}`\n ) {\n this.location =\n typeof source === \"string\"\n ? new Location(new FetchStore(source))\n : new Location(new WebFileSystemStore(source), path);\n this.version = version;\n }\n\n public async open(): Promise<OmeZarrImageLoader> {\n let zarrVersion = omeZarrToZarrVersion(this.version);\n const root = await openGroup(this.location, zarrVersion);\n const adaptedOmeImage = parseOmeZarrImage(root.attrs);\n const images = adaptedOmeImage.multiscales;\n if (images.length !== 1) {\n throw new Error(\n `Exactly one multiscale image is supported. Found ${images.length} images.`\n );\n }\n const metadata = images[0];\n if (metadata.datasets.length === 0) {\n throw new Error(`No datasets found in the multiscale image.`);\n }\n if (!zarrVersion) {\n zarrVersion = omeZarrToZarrVersion(adaptedOmeImage.originalVersion);\n }\n const arrayParams = metadata.datasets.map((d) =>\n createZarrArrayParams(this.location, d.path, zarrVersion)\n );\n const arrays = await Promise.all(\n arrayParams.map((params) => openArrayFromParams(params))\n );\n\n const shape = arrays[0].shape;\n const axes = metadata.axes;\n if (axes.length !== shape.length) {\n throw new Error(\n `Mismatch between number of axes (${axes.length}) and array shape (${shape.length})`\n );\n }\n return new OmeZarrImageLoader({\n metadata,\n arrays,\n arrayParams,\n });\n }\n}\n","const ALL_CATEGORIES = [\n \"fallbackVisible\",\n \"prefetchTime\",\n \"visibleCurrent\",\n \"fallbackBackground\",\n \"prefetchSpace\",\n] as const;\n\nexport type PriorityCategory = (typeof ALL_CATEGORIES)[number];\n\nexport type ImageSourcePolicyConfig = {\n profile?: string;\n prefetch: {\n x: number;\n y: number;\n z?: number;\n t?: number;\n };\n priorityOrder: PriorityCategory[];\n lod?: {\n min?: number;\n max?: number;\n bias?: number;\n };\n};\n\nexport type ImageSourcePolicy = Readonly<{\n profile: string;\n prefetch: {\n x: number;\n y: number;\n z: number;\n t: number;\n };\n priorityOrder: readonly PriorityCategory[];\n priorityMap: Readonly<Record<PriorityCategory, number>>;\n lod: {\n min: number;\n max: number;\n bias: number;\n };\n}>;\n\nexport function createImageSourcePolicy(\n config: ImageSourcePolicyConfig\n): ImageSourcePolicy {\n validatePolicyConfig(config);\n\n const prefetch = {\n x: config.prefetch.x,\n y: config.prefetch.y,\n z: config.prefetch.z ?? 0,\n t: config.prefetch.t ?? 0,\n };\n\n const priorityMap: Readonly<Record<PriorityCategory, number>> = Object.freeze(\n ALL_CATEGORIES.reduce<Record<PriorityCategory, number>>(\n (acc, cat) => {\n const idx = config.priorityOrder.indexOf(cat);\n acc[cat] = idx;\n return acc;\n },\n {} as Record<PriorityCategory, number>\n )\n );\n\n const lod = {\n min: config.lod?.min ?? 0,\n max: config.lod?.max ?? Number.MAX_SAFE_INTEGER,\n bias: config.lod?.bias ?? 0.5,\n };\n\n const resolved: ImageSourcePolicy = {\n profile: config.profile ?? \"custom\",\n prefetch,\n priorityOrder: Object.freeze([...config.priorityOrder]),\n priorityMap,\n lod,\n };\n\n return Object.freeze(resolved);\n}\n\nexport function createExplorationPolicy(\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicy {\n const base: ImageSourcePolicyConfig = {\n profile: \"exploration\",\n prefetch: { x: 1, y: 1, z: 1, t: 0 },\n priorityOrder: [\n \"fallbackVisible\",\n \"visibleCurrent\",\n \"prefetchSpace\",\n \"prefetchTime\",\n \"fallbackBackground\",\n ],\n };\n return createImageSourcePolicy(mergeConfig(base, overrides));\n}\n\nexport function createPlaybackPolicy(\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicy {\n const base: ImageSourcePolicyConfig = {\n profile: \"playback\",\n prefetch: { x: 0, y: 0, z: 0, t: 20 },\n priorityOrder: [\n \"fallbackVisible\",\n \"prefetchTime\",\n \"visibleCurrent\",\n \"fallbackBackground\",\n \"prefetchSpace\",\n ],\n };\n return createImageSourcePolicy(mergeConfig(base, overrides));\n}\n\nexport function createNoPrefetchPolicy(\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicy {\n const base: ImageSourcePolicyConfig = {\n profile: \"no-prefetch\",\n prefetch: { x: 0, y: 0, z: 0, t: 0 },\n priorityOrder: [\n \"fallbackVisible\",\n \"visibleCurrent\",\n \"fallbackBackground\",\n \"prefetchSpace\",\n \"prefetchTime\",\n ],\n };\n return createImageSourcePolicy(mergeConfig(base, overrides));\n}\n\nfunction validatePolicyConfig(config: ImageSourcePolicyConfig) {\n for (const [k, v] of Object.entries(config.prefetch)) {\n if (v === undefined) continue; // z/t may be omitted\n if (v < 0) {\n throw new Error(`prefetch.${k} must be a non-negative number`);\n }\n }\n\n const lod = config.lod;\n if (lod?.min !== undefined && lod?.max !== undefined && lod.min > lod.max) {\n throw new Error(`lod.min must be <= lod.max`);\n }\n\n const order = config.priorityOrder;\n if (\n order.length !== ALL_CATEGORIES.length ||\n new Set(order).size !== order.length\n ) {\n throw new Error(`priorityOrder must include all categories exactly once`);\n }\n}\n\nfunction mergeConfig(\n base: ImageSourcePolicyConfig,\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicyConfig {\n return {\n profile: overrides.profile ?? base.profile,\n prefetch: { ...base.prefetch, ...(overrides.prefetch ?? {}) },\n lod: { ...base.lod, ...(overrides.lod ?? {}) },\n priorityOrder: overrides.priorityOrder ?? base.priorityOrder,\n };\n}\n","import { vec3 } from \"gl-matrix\";\n\nexport class Spherical {\n public radius;\n public phi;\n public theta;\n\n constructor(radius: number, phi: number, theta: number) {\n this.radius = radius;\n this.phi = phi;\n this.theta = theta;\n }\n\n public toVec3() {\n const c = Math.cos(this.theta);\n return vec3.fromValues(\n this.radius * Math.sin(this.phi) * c,\n -this.radius * Math.sin(this.theta),\n this.radius * Math.cos(this.phi) * c\n );\n }\n}\n","import { vec3 } from \"gl-matrix\";\n\nimport { Color } from \"../../core/color\";\nimport { RenderableObject } from \"../../core/renderable_object\";\nimport { Texture2DArray } from \"../textures/texture_2d_array\";\nimport { Geometry } from \"../../core/geometry\";\n\n// TODO: add a border (or \"secondary\") color to improve contrast against background\ntype PointProperties = {\n position: vec3;\n color: Color;\n size: number;\n markerIndex: number;\n};\n\nexport class Points extends RenderableObject {\n private atlas_: Texture2DArray;\n\n constructor(points: PointProperties[], markerAtlas: Texture2DArray) {\n super();\n this.programName = \"points\";\n this.atlas_ = markerAtlas;\n\n points.forEach((point) => {\n const marker = point.markerIndex;\n if (marker < 0 || marker >= this.atlas_.depth) {\n throw new Error(\n `Markers must be in the range [0, ${this.atlas_.depth - 1}] (number of markers in atlas)`\n );\n }\n });\n\n const vertexData = points.flatMap((point) => [\n point.position[0],\n point.position[1],\n point.position[2],\n point.color.r,\n point.color.g,\n point.color.b,\n point.color.a,\n point.size,\n point.markerIndex,\n ]);\n const geometry = new Geometry(vertexData, [], \"points\");\n\n geometry.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n geometry.addAttribute({\n type: \"color\",\n itemSize: 4,\n offset: geometry.strideBytes,\n });\n geometry.addAttribute({\n type: \"size\",\n itemSize: 1,\n offset: geometry.strideBytes,\n });\n geometry.addAttribute({\n type: \"marker\",\n itemSize: 1,\n offset: geometry.strideBytes,\n });\n\n this.geometry = geometry;\n this.setTexture(0, this.atlas_);\n }\n\n public get type() {\n return \"Points\";\n }\n}\n"],"names":["Color","r","g","b","a","colorLike","hex","result","value","Renderer","canvas","color","projected_line_vert_default","projected_line_frag_default","mesh_vert_default","scalar_image_frag_default","scalar_image_array_frag_default","points_vert_default","points_frag_default","wireframe_vert_default","wireframe_frag_default","volume_vert_default","volume_frag_default","label_image_frag_default","shaderCode","projectedLineVertexShader","projectedLineFragmentShader","pointsVertexShader","pointsFragmentShader","wireframeVertexShader","wireframeFragmentShader","meshVertexShader","scalarImageFragmentShader","scalarImageArrayFragmentShader","labelImage","volumeVertexShader","volumeFragmentShader","Levels","Colors","getMode","nodeEnv","NODE_ENV","Logger","level","moduleName","message","params","args","timestamp","tag","output","WebGLShaderProgram","gl","vertexShaderSource","fragmentShaderSource","program","shaders","error","shader","name","location","info","type","exhaustiveCheck","numUniforms","i","SUPPORTED_UNIFORM_TYPES","source","parameter","SUPPORTED_UNIFORM_TYPES_","pragmaInjectDefines","WebGLShaderPrograms","code","replaceSourceDefines","defines","definesSource","key","nextLineNumber","sourceToInject","lut","generateUUID","d0","d1","d2","d3","Node","EPSILON","ARRAY_TYPE","degree","toRadian","y","create","out","glMatrix.ARRAY_TYPE","fromMat4","invert","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","multiply","b0","b1","b2","b3","fromScaling","v","fromRotationTranslationScale","q","s","x","z","w","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","sx","sy","sz","perspectiveNO","fovy","aspect","near","far","f","nf","perspective","orthoNO","left","right","bottom","top","lr","bt","ortho","targetTo","eye","target","up","eyex","eyey","eyez","upx","upy","upz","z0","z1","len","x0","x1","clone","length","fromValues","copy","set","add","subtract","scale","scaleAndAdd","distance","normalize","dot","cross","ax","ay","az","bx","by","bz","bezier","c","d","t","inverseFactor","inverseFactorTimesTwo","factorTimes2","factor1","factor2","factor3","factor4","transformMat4","m","equals","a0","a1","a2","glMatrix.EPSILON","sub","vec","stride","offset","count","fn","arg","l","setAxisAngle","axis","rad","aw","bw","slerp","omega","cosom","sinom","scale0","scale1","fromMat3","fTrace","fRoot","j","k","vec4.clone","vec4.copy","vec4.normalize","tmpvec3","vec3.create","xUnitVec3","vec3.fromValues","yUnitVec3","vec3.dot","vec3.cross","vec3.len","vec3.normalize","temp1","temp2","matr","mat3.create","view","squaredLength","lerp","exactEquals","Box3","min","max","vec3.clone","p","matrix","corners","tmp","vec3.transformMat4","GeometryAttributeIndex","Geometry","vertexData","indexData","primitive","attr","acc","curr","box","point","WebGLBuffers","geometry","buffers","vao","vboType","vbo","attributes","strideBytes","idx","eboType","ebo","WebGLTextures","texture","index","textureType","textureId","id","bytes","minFilter","maxFilter","filter","dataFormat","dataType","mode","format","levels","depth","width","height","total","Box2","vec2.clone","vec2.fromValues","vec2.exactEquals","WebGLState","cap","src","dst","enabled","flag","clampedBox","axisDirection","mat4.fromScaling","mat4.create","WebGLRenderer","viewport","viewportBox","rendererBox","opaque","transparent","frustum","renderContext","layer","camera","object","objectIndex","wireframeProgram","modelView","mat4.multiply","projection","resolution","objectUniforms","uniformName","newViewport","MAX_CONCURRENT","ChunkQueue","maxConcurrent","chunk","running","priorityA","priorityB","item","controller","promise","err","chunkDataTypes","isChunkData","ChunkData","supportedDataTypeNames","dtype","coordToIndex","lod","coord","almostEqual","epsilon","ChunkStore","loader","chunksT","chunksC","chunksAtT","xLod","yLod","zLod","chunkWidth","chunkHeight","chunkDepth","chunksX","chunksY","chunksZ","xOffset","yOffset","zOffset","timeIndex","sliceCoords","signal","xDim","yDim","rx","ry","tLod","prevTLod","cLod","prevCLod","clamp","INTERNAL_POLICY_KEY","ChunkStoreView","store","policy","dimensions","xLod0","yLod0","vec2.squaredLength","currentTimeIndex","currentTimeChunks","currentLODChunks","lowestResLOD","viewBounds2D","virtualWidth","canvasElement","bufferWidth","virtualUnitsPerScreenPixel","lodFactor","zBounds","visibleChunks","viewState","newPolicy","sourceAdjusted","desiredLOD","minPolicyLOD","maxPolicyLOD","viewBoundsCenter2D","vec2.create","vec2.lerp","zMin","zMax","viewBounds3D","markUnused","viewBounds2DCenter","paddedBounds","isInBounds","isChannelInSlice","isCurrentLOD","isFallbackLOD","prefetch","visible","priority","orderKey","numTimePoints","tEnd","squareDistance","normalizedDistance","isVisible","isPrefetch","bounds","chunkBounds","zDim","zShape","zScale","zTran","zPoint","zChunk","newBounds","vec2.equals","padX","padY","padZ","center","chunkCenter","dx","dy","state","ChunkManager","views","affectedChunks","existingOrPending","pending","_","updatedChunks","_viewState","anyVisible","anyPrefetch","minPriority","orderKeyForMinPriority","Stats","container","event","showPanel","addPanel","panel","beginTime","prevTime","frames","fpsPanel","msPanel","memPanel","time","memory","fg","bg","round","PR","WIDTH","HEIGHT","TEXT_X","TEXT_Y","GRAPH_X","GRAPH_Y","GRAPH_WIDTH","GRAPH_HEIGHT","context","maxValue","createStats","stats","LayerManager","callback","eventTypes","isEventType","EventContext","EventDispatcher","element","listener","e","Viewport","props","clientX","clientY","client","viewportRect","canvasRect","devicePixelRatio","canvasX","canvasY","canvasHeight","relativeX","relativeY","position","rect","clipPos","aspectRatio","validateViewportProps","viewportProps","elementToViewportId","seenViewportIds","existingViewportId","elementDescription","parseViewportConfigs","viewportConfigs","config","PixelSizeObserver","elements","wasChanged","Idetik","sizeDependents","overlay","WireframeGeometry","edgeSet","wireframeIndices","addEdge","i0","i1","i2","WORLD_UP","TrsTransform","quat.create","quat.multiply","quat.copy","quat.clone","vec3.add","vec3.copy","vec3.multiply","vec3.equals","mat4.targetTo","rotation","mat3.fromMat4","quat.fromMat3","quat.normalize","mat4.invert","mat4.fromRotationTranslationScale","RenderableObject","oldTexture","stale","programName","Plane","normal","vec3.length","inv","vec3.scale","Frustum","n","vec3.set","plane","Camera","vec4.fromValues","projectionInverse","viewPos","vec4.transformMat4","vec4.create","vec4.scale","worldPos","DEFAULT_ASPECT_RATIO","DEFAULT_WIDTH","DEFAULT_HEIGHT","OrthographicCamera","centerX","centerY","factor","topLeft","bottomRight","viewProjection","frameAspectRatio","viewportHalfWidth","viewportHalfHeight","mat4.ortho","DEFAULT_FOV","MIN_FOV","MAX_FOV","PerspectiveCamera","options","fov","mat4.perspective","glMatrix.toRadian","LEFT_MOUSE_BUTTON","PanZoomControls","posBeforeZoom","zoomFactor","posAfterZoom","delta","vec3.sub","Layer","opacity","blendMode","_context","newState","prevState","ProjectedLineGeometry","path","vertices","path_proportion","total_distance","vec3.distance","direction","current","previous","next","indices","ProjectedLine","taperOffset","taperPower","AxesLayer","makeAxis","end","ProjectedLineLayer","lines","line","getPathBoundingBox","getAxisBounds","values","xMin","xMax","yMin","yMax","TracksLayer","tracks","track","interpolatedPath","cubicBezierInterpolation","paths","pointsPerSegment","tangentFactor","tangents","pathTangents","vec3.scaleAndAdd","o","vec3.bezier","m0","m1","PlaneGeometry","widthSegments","heightSegments","vertex","gridX","gridY","gridX1","gridY1","segmentW","segmentH","iy","ix","u","normals","uvs","isTextureUnpackRowAlignment","bufferToDataType","buffer","textureDefaultValueRange","Texture","MAX_CHANNELS","validateChannel","contrastLimits","validateContrastLimits","validateChannels","channelProps","ImageRenderable","channels","textureToShader","channelIndex","property","newChannel","valueOffset","valueScale","channel","dataTypeToScalarImageShader","dataTypeToArrayImageShader","Texture2DArray","data","handlePointPickingEvent","pointerDownPos","getValueAtWorld","onPickValue","dragThreshold","pointerUpPos","vec2.distance","world","RenderablePool","bin","disposer","ChunkedImageLayer","layerOptions","orderedByLOD","nonVisibleChunks","image","zPointWorld","zValue","zLocal","zIdx","zClamped","sliceSize","existing","pooled","poolKeyForImageRenderable","currentLOD","localPos","pixelIndex","debug","chunks","Texture3D","BoxGeometry","depthSegments","wSeg","hSeg","dSeg","axisU","axisV","axisW","udir","vdir","faceWidth","faceHeight","faceDepth","wdir","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","vertexPosition","vy","vx","VolumeRenderable","dataTypeToVolumeShader","VolumeLayer","renderable","ImageLayer","region","Texture2D","defaultColorCycle","validateLookupTable","lookupTable","validateCycle","cycle","LabelColorMap","supportedDataTypes","validateImageData","imageData","LabelImageRenderable","colorCycleTexture","colorLookupTableTexture","colorMap","keys","numColors","LabelImageLayer","outlineSelected","AbortError","PromiseScheduler","task","resolve","reject","ImageSeriesLoader","seriesDimensionalIndex","seriesAttributes","token","newToken","attributesForLOD","seriesIndex","dim","seriesDimScale","seriesMax","indexIsFull","seriesStart","seriesStop","seriesLength","pointRegion","dimIndex","loadPromises","results","ImageSeriesLayer","seriesDimensionName","NodeNotFoundError","KeyError","BitroundCodec","configuration","_meta","meta","_arr","arr","BoolArray","#bytes","byteOffset","ByteStringArray","#encoder","chars","encoded","UnicodeStringArray","#data","str","json_decode_object","byteswap_inplace","bytes_per_element","numFlips","endByteIndex","CONSTRUCTORS","V2_STRING_REGEX","get_ctr","data_type","match","kind","ctr","get_strides","shape","order","row_major_stride","col_major_stride","ndim","step","create_chunk_key_encoder","separator","chunk_coords","get_array_order","codecs","endian_regex","coerce_dtype","endian","rest","v2_to_v3_array_metadata","v2_to_v3_group_metadata","is_dtype","query","is_boolean","is_string","is_bigint","is_object","is_sharding_codec","codec","ensure_correct_scalar","metadata","LITTLE_ENDIAN_OS","system_is_little_endian","TypedArray","BytesCodec","#strides","#TypedArray","#BYTES_PER_ELEMENT","#shape","#endian","sample","Crc32cCodec","throw_on_nan_replacer","_key","sort_keys_replacer","sorted","JsonCodec","#encoder_config","#decoder_config","encoding","skipkeys","ensure_ascii","check_circular","allow_nan","sort_keys","indent","strict","separators","buf","replacer_functions","items","replacer","new_value","sub_replacer","json_str","chr","full_str","proxy","prop","empty_like","convert_array_order","n_dims","size","src_data","out_data","src_idx","out_idx","get_order","row_major_strides","TransposeCodec","VLenUTF8","_chunk","decoder","pos","item_length","create_default_registry","registry","create_codec_pipeline","chunk_metadata","load_codecs","chunk_meta","promises","Codec","array_to_array","array_to_bytes","bytes_to_bytes","is_typed_array_like_meta","MAX_BIG_UINT","create_sharded_chunk_getter","shard_shape","encode_shard_key","sharding_config","get_range","index_shape","index_codec","cache","chunk_coord","shard_coord","shard_path","checksum_size","index_size","linear_offset","sel","Location","root","Group","#metadata","CONTEXT_MARKER","get_context","obj","create_context","shared_context","native_order","chunk_key","chunk_path","maybe_bytes","VERSION_COUNTER","create_version_counter","version_counts","get_counts","counts","version","load_attrs","meta_bytes","open_v2","loc","attrs","open_array_v2","open_group_v2","Array","_open_v3","meta_doc","open_v3","node","open","version_max","open_primary","open_secondary","fetch_range","url","opts","merge_init","storeOverrides","requestOverrides","base","resolved","handle_response","response","fetch_suffix","suffix_length","init","use_suffix_request","content_length","FetchStore","#overrides","#use_suffix_request","#merge_init","overrides","href","range","start","stop","product","iterables","iterators","it","slice_indices","step_is_negative","lower","upper","slice","create_queue","IndexError","msg","err_too_many_indices","selection","err_boundscheck","dim_len","err_negative_step","check_selection_length","normalize_integer_selection","dim_sel","IntDimIndexer","dim_chunk_len","dim_chunk_ix","dim_offset","dim_chunk_sel","SliceDimIndexer","dim_chunk_ix_from","dim_chunk_ix_to","dim_limit","dim_out_offset","dim_chunk_sel_start","remainder","dim_chunk_sel_stop","dim_chunk_nitems","dim_out_sel","normalize_selection","normalized","BasicIndexer","chunk_shape","ixr","sixr","dim_projections","mapping","unwrap","get","setter","_internal_get_array_context","indexer","queue","object_array_view","from","to","compat_chunk","get_typed_array_constructor","compat_scalar","dest","set_scalar_binary","projections","set_from_chunk_binary","get_with_setter","indices_len","out_selection","slices","curr_stride","proj","projs","dstride","dstrides","sstride","sstrides","sfrom","sstep","resolveFileHandleForPath","dirs","fname","dir","WebFileSystemStore","#root","fh","openGroup","zarr.open","openArray","openArrayFromParams","rootLocation","arrayLocation","createZarrArrayParams","arrayPath","zarrVersion","DEFAULT_WORKER_COUNT","workerPool","messageId","workerId","pendingMessages","canceledMessages","getWorkerInstance","worker","instance","handleWorkerMessage","success","workerInstance","handleWorkerError","workerIndex","failedWorkerId","replacementWorker","createWorker","WorkerKernel","getLeastBusyWorker","getChunkInWorker","zarrParams","chunkIndex","abortListener","ensureWorkerPool","terminateWorkerPool","getChunk","array","arrayParams","chunkCoords","PromiseQueue","scheduler","OmeZarrImageLoader","getLoaderAttributes","inferSourceDimensionMap","receivedChunk","validateTightlyPackedChunk","receivedShape","rowAlignment","receivedChunkData","receivedChunkStride","compactSize","compactData","zStride","yStride","zStart","srcStart","srcEnd","translation","subarray","zarr.get","calculateOffset","dimensionNames","dimName","regionIndex","zarr.slice","arrays","numAxes","dataset","names","xIndex","findDimensionIndex","yIndex","dims","getSourceDimension","zIndex","findDimensionIndexSafe","cIndex","tIndex","compareDimensions","util","val","assertIs","_arg","assertNever","_x","validKeys","filtered","checker","joinValues","objectUtil","first","second","ZodParsedType","getParsedType","ZodIssueCode","quotelessJson","ZodError","issues","subs","actualProto","_mapper","mapper","issue","fieldErrors","processError","el","formErrors","errorMap","_ctx","overrideErrorMap","setErrorMap","map","getErrorMap","makeIssue","errorMaps","issueData","fullPath","fullIssue","errorMessage","maps","EMPTY_PATH","addIssueToContext","ctx","overrideMap","ParseStatus","status","arrayValue","INVALID","pairs","syncPairs","pair","finalObject","DIRTY","OK","isAborted","isDirty","isValid","isAsync","__classPrivateFieldGet","receiver","__classPrivateFieldSet","errorUtil","_ZodEnum_cache","_ZodNativeEnum_cache","ParseInputLazyPath","parent","handleResult","processCreateParams","invalid_type_error","required_error","description","iss","_a","_b","ZodType","input","maybeAsyncResult","check","getIssueProperties","setError","refinementData","refinement","ZodEffects","ZodFirstPartyTypeKind","def","ZodOptional","ZodNullable","ZodArray","ZodPromise","option","ZodUnion","incoming","ZodIntersection","transform","defaultValueFunc","ZodDefault","ZodBranded","catchValueFunc","ZodCatch","This","ZodPipeline","ZodReadonly","cuidRegex","cuid2Regex","ulidRegex","uuidRegex","nanoidRegex","jwtRegex","durationRegex","emailRegex","_emojiRegex","emojiRegex","ipv4Regex","ipv4CidrRegex","ipv6Regex","ipv6CidrRegex","base64Regex","base64urlRegex","dateRegexSource","dateRegex","timeRegexSource","regex","timeRegex","datetimeRegex","isValidIP","ip","isValidJWT","jwt","alg","header","base64","decoded","isValidCidr","ZodString","tooBig","tooSmall","validation","minLength","maxLength","ch","floatSafeRemainder","valDecCount","stepDecCount","decCount","valInt","stepInt","ZodNumber","inclusive","ZodBigInt","ZodBoolean","ZodDate","minDate","maxDate","ZodSymbol","ZodUndefined","ZodNull","ZodAny","ZodUnknown","ZodNever","ZodVoid","schema","deepPartialify","ZodObject","newShape","fieldSchema","ZodTuple","shapeKeys","extraKeys","keyValidator","unknownKeys","catchall","_c","_d","defaultError","augmentation","merging","mask","newField","createZodEnum","handleResults","unionErrors","childCtx","dirty","types","getDiscriminator","ZodLazy","ZodLiteral","ZodEnum","ZodNativeEnum","ZodDiscriminatedUnion","discriminator","discriminatorValue","optionsMap","discriminatorValues","mergeValues","aType","bType","bKeys","sharedKeys","newObj","sharedValue","newArray","itemA","itemB","handleParsed","parsedLeft","parsedRight","merged","itemIndex","schemas","ZodRecord","keyType","valueType","third","ZodMap","finalMap","ZodSet","finalizeSet","parsedSet","minSize","maxSize","ZodFunction","makeArgsIssue","makeReturnsIssue","returns","me","parsedArgs","parsedReturns","returnType","func","getter","expectedValues","enumValues","newDef","opt","nativeEnumValues","promisified","effect","checkCtx","processed","executeRefinement","inner","preprocess","newCtx","ZodNaN","BRAND","inResult","freeze","cleanParams","custom","_params","fatal","_fatal","late","instanceOfType","cls","stringType","numberType","nanType","bigIntType","booleanType","dateType","symbolType","undefinedType","nullType","anyType","unknownType","neverType","voidType","arrayType","objectType","strictObjectType","unionType","discriminatedUnionType","intersectionType","tupleType","recordType","mapType","setType","functionType","lazyType","literalType","enumType","nativeEnumType","promiseType","effectsType","optionalType","nullableType","preprocessType","pipelineType","ostring","onumber","oboolean","coerce","NEVER","Image","errors","Plate","Well","versions","versionsSet","maybeGetVersion","ome","getVersion","omeZarrToZarrVersion","omeVersion","removeProperty","objCopy","loadOmeZarrPlate","zarr.Location","zarr.FetchStore","group","parsePlate","adaptPlateV04ToV05","PlateV04","platev04","adaptWellV04ToV05","wellv04","parseWell","WellV04","loadOmeZarrWell","loadOmeroChannels","parseOmeZarrImage","loadOmeroDefaults","adaptImageV04ToV05","imagev04","parseImage","ImageV04","OmeZarrImageSource","adaptedOmeImage","images","axes","ALL_CATEGORIES","createImageSourcePolicy","validatePolicyConfig","priorityMap","cat","createExplorationPolicy","mergeConfig","createPlaybackPolicy","createNoPrefetchPolicy","Spherical","radius","phi","theta","Points","points","markerAtlas","marker"],"mappings":"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AAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;A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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[20,21,22,23,24,25,26,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,107]}
1
+ {"version":3,"file":"index.js","sources":["../src/core/color.ts","../src/core/renderer.ts","../src/renderers/shaders/projected_line_vert.glsl","../src/renderers/shaders/projected_line_frag.glsl","../src/renderers/shaders/mesh_vert.glsl","../src/renderers/shaders/scalar_image_frag.glsl","../src/renderers/shaders/scalar_image_array_frag.glsl","../src/renderers/shaders/points_vert.glsl","../src/renderers/shaders/points_frag.glsl","../src/renderers/shaders/wireframe_vert.glsl","../src/renderers/shaders/wireframe_frag.glsl","../src/renderers/shaders/volume_vert.glsl","../src/renderers/shaders/volume_frag.glsl","../src/renderers/shaders/label_image_frag.glsl","../src/renderers/shaders/index.ts","../src/utilities/logger.ts","../src/renderers/webgl_shader_program.ts","../src/renderers/webgl_shader_programs.ts","../src/utilities/uuid_generator.ts","../src/core/node.ts","../../../node_modules/gl-matrix/esm/common.js","../../../node_modules/gl-matrix/esm/mat3.js","../../../node_modules/gl-matrix/esm/mat4.js","../../../node_modules/gl-matrix/esm/vec3.js","../../../node_modules/gl-matrix/esm/vec4.js","../../../node_modules/gl-matrix/esm/quat.js","../../../node_modules/gl-matrix/esm/vec2.js","../src/math/box3.ts","../src/core/geometry.ts","../src/renderers/webgl_buffers.ts","../src/renderers/webgl_textures.ts","../src/math/box2.ts","../src/renderers/WebGLState.ts","../src/renderers/webgl_renderer.ts","../src/data/chunk_queue.ts","../src/data/chunk.ts","../src/utilities/almost_equal.ts","../src/core/chunk_store.ts","../src/utilities/clamp.ts","../src/core/chunk_store_view.ts","../src/core/chunk_manager.ts","../src/utilities/vendored/stats.js","../src/utilities/stats.ts","../src/core/layer_manager.ts","../src/core/event_dispatcher.ts","../src/core/viewport.ts","../src/utilities/pixel_size_observer.ts","../src/idetik.ts","../src/core/wireframe_geometry.ts","../src/core/transforms.ts","../src/core/renderable_object.ts","../src/math/plane.ts","../src/math/frustum.ts","../src/objects/cameras/camera.ts","../src/objects/cameras/orthographic_camera.ts","../src/objects/cameras/perspective_camera.ts","../src/objects/cameras/controls.ts","../src/core/layer.ts","../src/objects/geometry/projected_line_geometry.ts","../src/objects/renderable/projected_line.ts","../src/layers/axes_layer.ts","../src/layers/projected_line_layer.ts","../src/layers/tracks_layer.ts","../src/objects/geometry/plane_geometry.ts","../src/objects/textures/texture.ts","../src/core/constants.ts","../src/objects/textures/channel.ts","../src/objects/renderable/image_renderable.ts","../src/objects/textures/texture_2d_array.ts","../src/layers/point_picking.ts","../src/utilities/renderable_pool.ts","../src/layers/chunked_image_layer.ts","../src/objects/textures/texture_3d.ts","../src/objects/geometry/box_geometry.ts","../src/objects/renderable/volume_renderable.ts","../src/layers/volume_layer.ts","../src/layers/image_layer.ts","../src/objects/textures/texture_2d.ts","../src/objects/renderable/label_color_map.ts","../src/objects/renderable/label_image_renderable.ts","../src/layers/label_image_layer.ts","../src/data/promise_scheduler.ts","../src/layers/image_series_loader.ts","../src/layers/image_series_layer.ts","../../../node_modules/@zarrita/core/dist/src/errors.js","../../../node_modules/@zarrita/core/dist/src/codecs/bitround.js","../../../node_modules/@zarrita/typedarray/dist/src/index.js","../../../node_modules/@zarrita/core/dist/src/util.js","../../../node_modules/@zarrita/core/dist/src/codecs/bytes.js","../../../node_modules/@zarrita/core/dist/src/codecs/crc32c.js","../../../node_modules/@zarrita/core/dist/src/codecs/json2.js","../../../node_modules/@zarrita/core/dist/src/codecs/transpose.js","../../../node_modules/@zarrita/core/dist/src/codecs/vlen-utf8.js","../../../node_modules/@zarrita/core/dist/src/codecs.js","../../../node_modules/@zarrita/core/dist/src/codecs/sharding.js","../../../node_modules/@zarrita/core/dist/src/hierarchy.js","../../../node_modules/@zarrita/core/dist/src/open.js","../../../node_modules/@zarrita/storage/dist/src/util.js","../../../node_modules/@zarrita/storage/dist/src/fetch.js","../../../node_modules/@zarrita/indexing/dist/src/util.js","../../../node_modules/@zarrita/indexing/dist/src/indexer.js","../../../node_modules/@zarrita/indexing/dist/src/get.js","../../../node_modules/@zarrita/indexing/dist/src/ops.js","../src/data/zarr/web_file_system_store.ts","../src/data/zarr/open.ts","../src/data/ome_zarr/worker_pool.ts","../src/data/ome_zarr/image_loader.ts","../../../node_modules/zod/lib/index.mjs","../src/data/ome_zarr/0.4/image.ts","../src/data/ome_zarr/0.4/plate.ts","../src/data/ome_zarr/0.4/well.ts","../src/data/ome_zarr/0.5/image.ts","../src/data/ome_zarr/0.5/plate.ts","../src/data/ome_zarr/0.5/well.ts","../src/data/ome_zarr/metadata_loaders.ts","../src/data/ome_zarr/image_source.ts","../src/core/image_source_policy.ts","../src/math/spherical.ts","../src/objects/renderable/points.ts"],"sourcesContent":["import { vec3, vec4 } from \"gl-matrix\";\n\nexport type ColorLike = Color | vec3 | vec4;\n\nexport class Color {\n public static readonly RED: Color = new Color(1.0, 0.0, 0.0);\n public static readonly GREEN: Color = new Color(0.0, 1.0, 0.0);\n public static readonly BLUE: Color = new Color(0.0, 0.0, 1.0);\n public static readonly YELLOW: Color = new Color(1.0, 1.0, 0.0);\n public static readonly MAGENTA: Color = new Color(1.0, 0.0, 1.0);\n public static readonly CYAN: Color = new Color(0.0, 1.0, 1.0);\n public static readonly BLACK: Color = new Color(0.0, 0.0, 0.0);\n public static readonly WHITE: Color = new Color(1.0, 1.0, 1.0);\n public static readonly TRANSPARENT: Color = new Color(0.0, 0.0, 0.0, 0.0);\n\n // RGBA color values in the range [0, 1]\n private readonly rgba_: readonly [number, number, number, number];\n\n constructor(r: number, g: number, b: number, a?: number) {\n if (r < 0 || r > 1 || g < 0 || g > 1 || b < 0 || b > 1) {\n throw new Error(\"RGB values must be in the range [0, 1]\");\n }\n if (a !== undefined && (a < 0 || a > 1)) {\n throw new Error(\"Alpha value must be in the range [0, 1]\");\n }\n this.rgba_ = [r, g, b, a ?? 1.0];\n }\n\n public get rgb(): [number, number, number] {\n return [this.rgba_[0], this.rgba_[1], this.rgba_[2]];\n }\n\n public get rgba(): readonly [number, number, number, number] {\n return this.rgba_;\n }\n\n public get r(): number {\n return this.rgba_[0];\n }\n\n public get g(): number {\n return this.rgba_[1];\n }\n\n public get b(): number {\n return this.rgba_[2];\n }\n\n public get a(): number {\n return this.rgba_[3];\n }\n\n public get rgbHex(): string {\n return `#${this.toHexComponent(this.r)}${this.toHexComponent(this.g)}${this.toHexComponent(this.b)}`;\n }\n\n public get packed(): number {\n return (\n (Math.round(this.r * 255) << 24) |\n (Math.round(this.g * 255) << 16) |\n (Math.round(this.b * 255) << 8) |\n Math.round(this.a * 255)\n );\n }\n\n public static from(colorLike: ColorLike): Color {\n if (colorLike instanceof Color) {\n return colorLike;\n }\n\n if (Array.isArray(colorLike)) {\n return new Color(colorLike[0], colorLike[1], colorLike[2], colorLike[3]);\n }\n\n throw new Error(\"Unsupported color format\");\n }\n\n public static fromRgbHex(hex: string): Color {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) {\n throw new Error(\"Invalid RGB hex, use form '#RRGGBB'\");\n }\n return new Color(\n parseInt(result[1], 16) / 255,\n parseInt(result[2], 16) / 255,\n parseInt(result[3], 16) / 255,\n 1.0\n );\n }\n\n private toHexComponent(value: number): string {\n const hex = Math.round(value * 255)\n .toString(16)\n .padStart(2, \"0\");\n return hex.length === 1 ? \"0\" + hex : hex;\n }\n}\n","import { Camera } from \"../objects/cameras/camera\";\nimport { Color, ColorLike } from \"./color\";\nimport { Layer } from \"./layer\";\nimport { Viewport } from \"./viewport\";\n\nexport abstract class Renderer {\n private readonly canvas_: HTMLCanvasElement | null;\n private width_ = 0;\n private height_ = 0;\n private backgroundColor_: Color = new Color(0, 0, 0, 0);\n\n protected renderedObjects_ = 0;\n protected abstract resize(width: number, height: number): void;\n protected abstract renderObject(\n layer: Layer,\n objectIndex: number,\n camera: Camera\n ): void;\n protected abstract clear(): void;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas_ = canvas;\n this.updateRendererSize();\n }\n\n public abstract render(viewport: Viewport): void;\n\n public updateSize(): void {\n this.updateRendererSize();\n this.resize(this.width_, this.height_);\n }\n\n private updateRendererSize() {\n this.width_ = this.canvas.clientWidth * window.devicePixelRatio;\n this.height_ = this.canvas.clientHeight * window.devicePixelRatio;\n\n if (this.canvas.width !== this.width_) this.canvas.width = this.width_;\n if (this.canvas.height !== this.height_) this.canvas.height = this.height_;\n }\n\n protected get canvas() {\n return this.canvas_!;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public get backgroundColor(): Color {\n return this.backgroundColor_;\n }\n\n public get renderedObjects() {\n return this.renderedObjects_;\n }\n\n public set backgroundColor(color: ColorLike) {\n this.backgroundColor_ = Color.from(color);\n }\n}\n","#version 300 es\n\nconst float PI = 3.14159265;\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 3) in vec3 inPrevPosition;\nlayout (location = 4) in vec3 inNextPosition;\nlayout (location = 5) in float direction;\nlayout (location = 6) in float path_proportion;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\nuniform vec2 Resolution;\nuniform float LineWidth;\nuniform float TaperOffset;\nuniform float TaperPower;\n\n// adapted from https://github.com/mattdesl/webgl-lines\nvoid main() {\n mat4 projModelView = Projection * ModelView;\n\n vec4 prevPos = projModelView * vec4(inPrevPosition, 1.0);\n vec4 currPos = projModelView * vec4(inPosition, 1.0);\n vec4 nextPos = projModelView * vec4(inNextPosition, 1.0);\n\n vec2 aspectVec = vec2(Resolution.x / Resolution.y, 1.0);\n vec2 prevScreen = (prevPos.xy / prevPos.w) * aspectVec;\n vec2 currScreen = (currPos.xy / currPos.w) * aspectVec;\n vec2 nextScreen = (nextPos.xy / nextPos.w) * aspectVec;\n\n vec2 diff;\n if (prevPos == currPos) {\n // first point on the path\n diff = nextScreen - currScreen;\n } else if (nextPos == currPos) {\n // last point on the path\n diff = currScreen - prevScreen;\n } else {\n // middle point on the path\n // combine the two directions to get a cheap miter\n // this is not a true miter join, but it also doesn't explode\n vec2 prevDiff = currScreen - prevScreen;\n vec2 nextDiff = nextScreen - currScreen;\n diff = normalize(prevDiff) + normalize(nextDiff);\n }\n\n // direction is + or -; which way to project the vertex away from the path\n // path_proportion is the distance along the path, from 0 to 1\n float d = sign(direction);\n float taper = 1.0;\n if (TaperPower > 0.0) {\n // glsl `pow(x, y)` is undefined if x < 0 or x = 0 and y <= 0\n float t = clamp(path_proportion - TaperOffset, -0.5, 0.5);\n float angle = PI * t;\n taper = pow(cos(angle), TaperPower);\n }\n vec2 normal = normalize(vec2(-diff.y, diff.x));\n\n vec4 offset = vec4(\n normal * d * taper * LineWidth / 2.0 / aspectVec,\n 0.0,\n 0.0\n );\n gl_Position = currPos + offset * currPos.w;\n\n // draw as GL_POINTS for debugging\n gl_PointSize = 5.0;\n}\n","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform vec3 LineColor;\n\nvoid main() {\n fragColor = vec4(LineColor, 1.0);\n}\n","#version 300 es\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 1) in vec3 inNormal;\nlayout (location = 2) in vec2 inUV;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nout vec2 TexCoords;\n\nvoid main() {\n TexCoords = inUV;\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n}","#version 300 es\n#pragma inject_defines\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\n#if defined TEXTURE_DATA_TYPE_INT\nuniform mediump isampler2D ImageSampler;\n#elif defined TEXTURE_DATA_TYPE_UINT\nuniform mediump usampler2D ImageSampler;\n#else\nuniform mediump sampler2D ImageSampler;\n#endif\n\nuniform vec3 Color;\nuniform float ValueOffset;\nuniform float ValueScale;\nuniform float u_opacity;\n\nin vec2 TexCoords;\n\nvoid main() {\n float texel = float(texture(ImageSampler, TexCoords).r);\n float value = (texel + ValueOffset) * ValueScale;\n fragColor = vec4(value * Color, u_opacity);\n}","#version 300 es\n#pragma inject_defines\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\n#if defined TEXTURE_DATA_TYPE_INT\nuniform mediump isampler2DArray ImageSampler;\n#elif defined TEXTURE_DATA_TYPE_UINT\nuniform mediump usampler2DArray ImageSampler;\n#else\nuniform mediump sampler2DArray ImageSampler;\n#endif\n// Define a maximum number of channels\n#define MAX_CHANNELS 32\nuniform uint ChannelCount;\nuniform bool Visible[MAX_CHANNELS];\nuniform vec3 Color[MAX_CHANNELS];\nuniform float ValueOffset[MAX_CHANNELS];\nuniform float ValueScale[MAX_CHANNELS];\nuniform float u_opacity;\n\nin vec2 TexCoords;\n\nvoid main() {\n vec3 rgbColor = vec3(0, 0, 0);\n for (uint i = 0u; i < ChannelCount; i++) {\n if (!Visible[i]) continue;\n float texel = float(texture(ImageSampler, vec3(TexCoords, i)).r);\n float value = (texel + ValueOffset[i]) * ValueScale[i];\n // clamp to [0, 1] because contrast limits may put values out of this range,\n // which distorts colors in other channels\n value = clamp(value, 0.0, 1.0);\n rgbColor += value * Color[i];\n }\n fragColor = vec4(rgbColor, u_opacity);\n}\n","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 7) in vec4 inColor;\nlayout (location = 8) in float inSize;\nlayout (location = 9) in float inMarker;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nout vec4 color;\nflat out uint marker;\n\n\nvoid main() {\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n gl_PointSize = inSize;\n color = inColor;\n marker = uint(inMarker);\n}\n\n","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform mediump sampler2DArray markerAtlas;\n\nin vec4 color;\nflat in uint marker;\n\nuniform float u_opacity;\n\n\nvoid main() {\n float alpha = texture(markerAtlas, vec3(gl_PointCoord, marker)).r;\n float alpha_threshold = 1e-2;\n if (alpha < alpha_threshold) {\n discard;\n }\n fragColor = vec4(color.rgb, u_opacity * alpha * color.a);\n}\n\n","#version 300 es\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 1) in vec3 inNormal;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nvoid main() {\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n}","#version 300 es\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform float u_opacity;\nuniform vec3 u_color;\n\nvoid main() {\n fragColor = vec4(u_color, u_opacity);\n}","#version 300 es\n\nlayout (location = 0) in vec3 inPosition;\nlayout (location = 2) in vec2 inUV;\n\nuniform mat4 Projection;\nuniform mat4 ModelView;\n\nout vec2 TexCoords;\n\nvoid main() {\n TexCoords = inUV;\n gl_Position = Projection * ModelView * vec4(inPosition, 1.0);\n}\n","#version 300 es\n#pragma inject_defines\n\nprecision mediump float;\n\nlayout (location = 0) out vec4 fragColor;\n\n#if defined TEXTURE_DATA_TYPE_INT\nuniform mediump isampler3D ImageSampler;\n#elif defined TEXTURE_DATA_TYPE_UINT\nuniform mediump usampler3D ImageSampler;\n#else\nuniform mediump sampler3D ImageSampler;\n#endif\n\nin vec2 TexCoords;\n\nvoid main() {\n float alpha = 0.0;\n /* Will replace fixed steps and normalization with uniforms later */\n for (int i = 0; i < 256; i++) {\n float z = float(i) / 255.0;\n float texel = float(texture(ImageSampler, vec3(TexCoords, z)).r);\n float newAlpha = clamp(texel / 1000.0, 0.0, 1.0);\n alpha = (1.0 - alpha) * newAlpha + alpha;\n }\n float displayValue = alpha;\n fragColor = vec4(displayValue, displayValue, displayValue, 1.0);\n}\n","#version 300 es\n\nprecision mediump float;\nprecision highp int;\n\nlayout (location = 0) out vec4 fragColor;\n\nuniform highp usampler2D ImageSampler;\nuniform mediump sampler2D ColorCycleSampler;\nuniform highp usampler2D ColorLookupTableSampler;\n\nuniform float u_opacity;\nuniform float u_outlineSelected; // Note: Using float instead of bool due to framework uniform handling\nuniform float u_selectedValue;\n\nin vec2 TexCoords;\n\nvec4 unpackRgba(uint packed) {\n uint r = (packed >> 24u) & 0xFFu;\n uint g = (packed >> 16u) & 0xFFu;\n uint b = (packed >> 8u) & 0xFFu;\n uint a = packed & 0xFFu;\n return vec4(float(r), float(g), float(b), float(a)) / 255.0;\n}\n\nbool isEdgePixel(uint centerValue) {\n vec2 texSize = vec2(textureSize(ImageSampler, 0));\n vec2 texelSize = 1.0 / texSize;\n \n // Check 8-connected neighbors\n for (int dx = -1; dx <= 1; dx++) {\n for (int dy = -1; dy <= 1; dy++) {\n if (dx == 0 && dy == 0) continue; // Skip center pixel\n \n vec2 neighborCoords = TexCoords + vec2(float(dx), float(dy)) * texelSize;\n \n // Skip if out of bounds\n if (neighborCoords.x < 0.0 || neighborCoords.x > 1.0 || \n neighborCoords.y < 0.0 || neighborCoords.y > 1.0) {\n continue;\n }\n \n uint neighborValue = texture(ImageSampler, neighborCoords).r;\n if (neighborValue != centerValue) {\n return true;\n }\n }\n }\n return false;\n}\n\nvoid main() {\n uint texel = texture(ImageSampler, TexCoords).r;\n \n // Check if this pixel is the selected value\n bool isSelectedValue = u_outlineSelected > 0.5 && u_selectedValue >= 0.0 && float(texel) == u_selectedValue;\n \n // Check if we should outline this selected segment\n if (isSelectedValue) {\n if (isEdgePixel(texel)) {\n // Draw outline in bright white with layer opacity\n fragColor = vec4(1.0, 1.0, 1.0, u_opacity);\n return;\n }\n }\n\n uint mapLength = uint(textureSize(ColorLookupTableSampler, 0).x);\n for (uint i = 0u; i < mapLength; ++i) {\n uint key = texelFetch(ColorLookupTableSampler, ivec2(i, 0), 0).r;\n if (texel == key) {\n uint value = texelFetch(ColorLookupTableSampler, ivec2(i, 1), 0).r;\n vec4 color = unpackRgba(value);\n \n // If this is the selected segment and outlining is enabled, make it slightly transparent\n float alpha = isSelectedValue ? u_opacity * color.a * 0.9 : u_opacity * color.a;\n \n fragColor = vec4(color.rgb, alpha);\n return;\n }\n }\n\n uint cycleLength = uint(textureSize(ColorCycleSampler, 0).x);\n uint index = uint(texel - 1u) % cycleLength;\n vec4 color = texelFetch(ColorCycleSampler, ivec2(index, 0), 0);\n \n // If this is the selected segment and outlining is enabled, make it slightly transparent\n float alpha = isSelectedValue ? u_opacity * color.a * 0.9 : u_opacity * color.a;\n \n fragColor = vec4(color.rgb, alpha);\n}","import projectedLineVertexShader from \"./projected_line_vert.glsl\";\nimport projectedLineFragmentShader from \"./projected_line_frag.glsl\";\nimport meshVertexShader from \"./mesh_vert.glsl\";\nimport scalarImageFragmentShader from \"./scalar_image_frag.glsl\";\nimport scalarImageArrayFragmentShader from \"./scalar_image_array_frag.glsl\";\nimport pointsVertexShader from \"./points_vert.glsl\";\nimport pointsFragmentShader from \"./points_frag.glsl\";\nimport wireframeVertexShader from \"./wireframe_vert.glsl\";\nimport wireframeFragmentShader from \"./wireframe_frag.glsl\";\nimport volumeVertexShader from \"./volume_vert.glsl\";\nimport volumeFragmentShader from \"./volume_frag.glsl\";\nimport labelImage from \"./label_image_frag.glsl\";\n\nexport type Shader =\n | \"floatScalarImage\"\n | \"floatScalarImageArray\"\n | \"floatVolume\"\n | \"intScalarImage\"\n | \"intScalarImageArray\"\n | \"intVolume\"\n | \"labelImage\"\n | \"points\"\n | \"projectedLine\"\n | \"uintScalarImage\"\n | \"uintScalarImageArray\"\n | \"uintVolume\"\n | \"wireframe\";\n\ntype ShaderCode = {\n vertex: string;\n vertexDefines?: ReadonlyMap<string, string>;\n fragment: string;\n fragmentDefines?: ReadonlyMap<string, string>;\n};\n\nexport const shaderCode: Record<Shader, ShaderCode> = {\n projectedLine: {\n vertex: projectedLineVertexShader,\n fragment: projectedLineFragmentShader,\n },\n points: {\n vertex: pointsVertexShader,\n fragment: pointsFragmentShader,\n },\n wireframe: {\n vertex: wireframeVertexShader,\n fragment: wireframeFragmentShader,\n },\n floatScalarImage: {\n vertex: meshVertexShader,\n fragment: scalarImageFragmentShader,\n },\n floatScalarImageArray: {\n vertex: meshVertexShader,\n fragment: scalarImageArrayFragmentShader,\n },\n intScalarImage: {\n vertex: meshVertexShader,\n fragment: scalarImageFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_INT\", \"1\"]]),\n },\n intScalarImageArray: {\n vertex: meshVertexShader,\n fragment: scalarImageArrayFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_INT\", \"1\"]]),\n },\n uintScalarImage: {\n vertex: meshVertexShader,\n fragment: scalarImageFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_UINT\", \"1\"]]),\n },\n uintScalarImageArray: {\n vertex: meshVertexShader,\n fragment: scalarImageArrayFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_UINT\", \"1\"]]),\n },\n labelImage: {\n vertex: meshVertexShader,\n fragment: labelImage,\n },\n floatVolume: {\n vertex: volumeVertexShader,\n fragment: volumeFragmentShader,\n },\n intVolume: {\n vertex: volumeVertexShader,\n fragment: volumeFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_INT\", \"1\"]]),\n },\n uintVolume: {\n vertex: volumeVertexShader,\n fragment: volumeFragmentShader,\n fragmentDefines: new Map([[\"TEXTURE_DATA_TYPE_UINT\", \"1\"]]),\n },\n};\n","type LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\";\n\nconst Levels = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n} satisfies Record<LogLevel, number>;\n\nconst Colors = {\n debug: \"\\x1b[90m\", // gray\n info: \"\\x1b[36m\", // cyan\n warn: \"\\x1b[33m\", // yellow\n error: \"\\x1b[31m\", // red\n} satisfies Record<LogLevel, string>;\n\n// Add new module names here as needed to represent different parts of the application\ntype Module =\n | \"Channel\"\n | \"Chunk\"\n | \"ChunkManager\"\n | \"ChunkManagerSource\"\n | \"ChunkQueue\"\n | \"ChunkStore\"\n | \"ChunkStoreView\"\n | \"ChunkedImageLayer\"\n | \"EventDispatcher\"\n | \"Idetik\"\n | \"ImageLayer\"\n | \"ImageSeriesLoader\"\n | \"LabelImageLayer\"\n | \"Layer\"\n | \"PixelSizeObserver\"\n | \"RenderablePool\"\n | \"Viewport\"\n | \"VolumeLayer\"\n | \"WebGLRenderer\"\n | \"WebGLShaderProgram\"\n | \"WebGLTexture\"\n | \"WireframeGeometry\"\n | \"ZarrWorker\";\n\nexport function getMode(): \"production\" | \"development\" | \"test\" {\n const nodeEnv =\n typeof process !== \"undefined\" && typeof process.env?.NODE_ENV === \"string\"\n ? process.env.NODE_ENV\n : undefined;\n\n if (\n nodeEnv === \"production\" ||\n nodeEnv === \"development\" ||\n nodeEnv === \"test\"\n ) {\n return nodeEnv;\n }\n\n if (typeof window !== \"undefined\") {\n const { NODE_ENV } = window as { NODE_ENV?: unknown };\n\n if (\n NODE_ENV === \"production\" ||\n NODE_ENV === \"development\" ||\n NODE_ENV === \"test\"\n ) {\n return NODE_ENV;\n }\n }\n\n return \"development\";\n}\nexport class Logger {\n private static logLevel_: LogLevel =\n getMode() === \"production\" ? \"warn\" : \"debug\";\n\n public static setLogLevel(level: LogLevel) {\n Logger.logLevel_ = level;\n }\n\n public static debug(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"debug\", moduleName, message, ...params);\n }\n\n public static info(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"info\", moduleName, message, ...params);\n }\n\n public static warn(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"warn\", moduleName, message, ...params);\n }\n\n public static error(\n moduleName: Module,\n message: string,\n ...params: unknown[]\n ) {\n Logger.log(\"error\", moduleName, message, ...params);\n }\n\n private static log(\n level: LogLevel,\n moduleName: Module,\n message: string,\n ...args: unknown[]\n ) {\n if (Levels[level] < Levels[Logger.logLevel_]) return;\n\n const timestamp = new Date().toISOString();\n const color = Colors[level];\n const tag = `[${timestamp}][${level.toUpperCase()}][${moduleName}]`;\n const output = [`${color}${tag}`, message, ...args];\n\n switch (level) {\n case \"debug\":\n console.debug(...output); // eslint-disable-line no-console\n break;\n case \"info\":\n console.info(...output); // eslint-disable-line no-console\n break;\n case \"warn\":\n console.warn(...output); // eslint-disable-line no-console\n break;\n case \"error\":\n console.error(...output); // eslint-disable-line no-console\n break;\n }\n }\n}\n","import { Logger } from \"../utilities/logger\";\nimport { mat4, vec2, vec3 } from \"gl-matrix\";\n\nexport class WebGLShaderProgram {\n private readonly gl_: WebGL2RenderingContext;\n private readonly program_: WebGLProgram;\n private readonly uniformInfo_: Map<\n string,\n [WebGLUniformLocation, WebGLActiveInfo]\n > = new Map();\n\n constructor(\n gl: WebGL2RenderingContext,\n vertexShaderSource: string,\n fragmentShaderSource: string\n ) {\n this.gl_ = gl;\n\n const program = gl.createProgram();\n if (!program) {\n throw new Error(`Failed to create WebGL shader program`);\n }\n this.program_ = program;\n\n const shaders = [];\n try {\n shaders.push(this.addShader(vertexShaderSource, gl.VERTEX_SHADER));\n shaders.push(this.addShader(fragmentShaderSource, gl.FRAGMENT_SHADER));\n this.link();\n this.preprocessUniformLocations();\n } catch (error) {\n gl.deleteProgram(program);\n throw error;\n } finally {\n shaders.forEach((shader) => this.gl_.deleteShader(shader));\n }\n }\n\n public setUniform(name: string, value: unknown) {\n const [location, info] = this.uniformInfo_.get(name) ?? [];\n if (!location || !info) {\n throw new Error(`Uniform \"${name}\" not found in shader program`);\n }\n const type = info.type as SupportedUniformType;\n switch (type) {\n // There is no dedicated uniform1b in WebGL, but passing through\n // as a float or signed integer works, so fallthrough to float\n // for simplicity.\n case this.gl_.BOOL:\n case this.gl_.FLOAT:\n if (typeof value === \"number\") {\n this.gl_.uniform1f(location, value);\n } else {\n this.gl_.uniform1fv(location, value as Iterable<number>);\n }\n break;\n case this.gl_.FLOAT_VEC2:\n this.gl_.uniform2fv(location, value as vec2);\n break;\n case this.gl_.FLOAT_VEC3:\n this.gl_.uniform3fv(location, value as vec3);\n break;\n case this.gl_.FLOAT_MAT4:\n this.gl_.uniformMatrix4fv(location, false, value as mat4);\n break;\n case this.gl_.INT:\n this.gl_.uniform1i(location, value as number);\n break;\n case this.gl_.UNSIGNED_INT:\n this.gl_.uniform1ui(location, value as number);\n break;\n // For samplers, the value is the texture index.\n case this.gl_.SAMPLER_2D:\n case this.gl_.SAMPLER_CUBE:\n case this.gl_.SAMPLER_3D:\n case this.gl_.SAMPLER_2D_ARRAY:\n case this.gl_.SAMPLER_2D_SHADOW:\n case this.gl_.SAMPLER_CUBE_SHADOW:\n case this.gl_.SAMPLER_2D_ARRAY_SHADOW:\n case this.gl_.INT_SAMPLER_2D:\n case this.gl_.INT_SAMPLER_3D:\n case this.gl_.INT_SAMPLER_CUBE:\n case this.gl_.INT_SAMPLER_2D_ARRAY:\n case this.gl_.UNSIGNED_INT_SAMPLER_2D:\n case this.gl_.UNSIGNED_INT_SAMPLER_3D:\n case this.gl_.UNSIGNED_INT_SAMPLER_CUBE:\n case this.gl_.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n this.gl_.uniform1i(location, value as number);\n break;\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unhandled uniform type: ${exhaustiveCheck}`);\n }\n }\n }\n\n private preprocessUniformLocations() {\n const numUniforms = this.gl_.getProgramParameter(\n this.program_,\n this.gl_.ACTIVE_UNIFORMS\n );\n for (let i = 0; i < numUniforms; i++) {\n const info = this.gl_.getActiveUniform(this.program_, i);\n if (info) {\n if (!SUPPORTED_UNIFORM_TYPES.has(info.type)) {\n throw new Error(\n `Unsupported uniform type \"${info.type}\" (GLenum) found in shader program for uniform \"${info.name}\"`\n );\n }\n\n const location = this.gl_.getUniformLocation(this.program_, info.name);\n if (location) {\n this.uniformInfo_.set(info.name, [location, info]);\n Logger.debug(\n \"WebGLShaderProgram\",\n \"Uniform found:\",\n info.name,\n info.type,\n info.size\n );\n }\n }\n }\n }\n\n private addShader(source: string, type: number) {\n const shader = this.gl_.createShader(type);\n if (!shader) {\n throw new Error(`Failed to create a new shader of type ${type}`);\n }\n\n this.gl_.shaderSource(shader, source);\n this.gl_.compileShader(shader);\n if (!this.gl_.getShaderParameter(shader, this.gl_.COMPILE_STATUS)) {\n const message = this.gl_.getShaderInfoLog(shader);\n this.gl_.deleteShader(shader);\n throw new Error(`Error compiling shader: ${message}`);\n }\n\n this.gl_.attachShader(this.program_, shader);\n return shader;\n }\n\n private link() {\n this.gl_.linkProgram(this.program_);\n if (!this.getParameter(this.gl_.LINK_STATUS)) {\n const message = this.gl_.getProgramInfoLog(this.program_);\n throw new Error(`Error linking program: ${message}`);\n }\n }\n\n public use() {\n this.gl_.useProgram(this.program_);\n }\n\n private getParameter(parameter: number) {\n return this.gl_.getProgramParameter(this.program_, parameter);\n }\n\n public get uniformNames(): string[] {\n return Array.from(this.uniformInfo_.keys());\n }\n}\n\n// using an array and converting to a set allows us to also create a type here\nconst SUPPORTED_UNIFORM_TYPES_ =\n typeof window !== \"undefined\" // Don't error in SSR contexts.\n ? [\n WebGL2RenderingContext.BOOL,\n WebGL2RenderingContext.FLOAT,\n WebGL2RenderingContext.FLOAT_VEC2,\n WebGL2RenderingContext.FLOAT_VEC3,\n WebGL2RenderingContext.FLOAT_MAT4,\n WebGL2RenderingContext.SAMPLER_2D,\n WebGL2RenderingContext.SAMPLER_CUBE,\n WebGL2RenderingContext.SAMPLER_3D,\n WebGL2RenderingContext.SAMPLER_2D_ARRAY,\n WebGL2RenderingContext.SAMPLER_2D_SHADOW,\n WebGL2RenderingContext.SAMPLER_CUBE_SHADOW,\n WebGL2RenderingContext.SAMPLER_2D_ARRAY_SHADOW,\n WebGL2RenderingContext.INT,\n WebGL2RenderingContext.INT_SAMPLER_2D,\n WebGL2RenderingContext.INT_SAMPLER_3D,\n WebGL2RenderingContext.INT_SAMPLER_CUBE,\n WebGL2RenderingContext.INT_SAMPLER_2D_ARRAY,\n WebGL2RenderingContext.UNSIGNED_INT,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_2D,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_3D,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_CUBE,\n WebGL2RenderingContext.UNSIGNED_INT_SAMPLER_2D_ARRAY,\n ]\n : [];\ntype SupportedUniformType = (typeof SUPPORTED_UNIFORM_TYPES_)[GLenum];\nconst SUPPORTED_UNIFORM_TYPES: ReadonlySet<GLenum> = new Set<GLenum>(\n SUPPORTED_UNIFORM_TYPES_\n);\n","import { Shader, shaderCode } from \"./shaders\";\nimport { WebGLShaderProgram } from \"./webgl_shader_program\";\n\nconst pragmaInjectDefines = \"#pragma inject_defines\";\n\nexport class WebGLShaderPrograms {\n private gl_: WebGL2RenderingContext;\n private programs_: Map<Shader, WebGLShaderProgram> = new Map();\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n }\n\n public use(shader: Shader): WebGLShaderProgram {\n let program = this.programs_.get(shader);\n if (program === undefined) {\n const code = shaderCode[shader];\n const vertexShaderSource = replaceSourceDefines(\n code.vertex,\n code.vertexDefines\n );\n const fragmentShaderSource = replaceSourceDefines(\n code.fragment,\n code.fragmentDefines\n );\n program = new WebGLShaderProgram(\n this.gl_,\n vertexShaderSource,\n fragmentShaderSource\n );\n program.use();\n const error = this.gl_.getError();\n if (error !== this.gl_.NO_ERROR) {\n throw new Error(`Error using WebGL program: ${error}`);\n }\n this.programs_.set(shader, program);\n } else {\n program.use();\n }\n return program;\n }\n}\n\nfunction replaceSourceDefines(\n source: string,\n defines?: ReadonlyMap<string, string>\n): string {\n if (defines === undefined || defines.size == 0) return source;\n if (!source.includes(pragmaInjectDefines)) {\n throw new Error(\n `Shader source does not contain \"${pragmaInjectDefines}\" directive`\n );\n }\n const definesSource = Array(defines.entries())\n .map(([key, value]) => `#define ${key} ${value}`)\n .join(\"\\n\");\n // Offset the line number so that the original source file line\n // numbers are interpretable. The +1 accounts for the #pragma directive\n // to be replaced.\n const lineNumberOffset = 1 - defines.size;\n const nextLineNumber = `#line __LINE__ + ${lineNumberOffset}`;\n const sourceToInject = `${definesSource}\\n${nextLineNumber}`;\n return source.replace(pragmaInjectDefines, sourceToInject);\n}\n","// prettier-ignore\nconst lut = [\n '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b',\n '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17',\n '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23',\n '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f',\n '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b',\n '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47',\n '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53',\n '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f',\n '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b',\n '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77',\n '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83',\n '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f',\n '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b',\n '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7',\n 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3',\n 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf',\n 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb',\n 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7',\n 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3',\n 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef',\n 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb',\n 'fc', 'fd', 'fe', 'ff'\n];\n\n// prettier-ignore\nexport function generateUUID() {\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n const uuid =\n lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] +\n lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +\n lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' +\n lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +\n lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' +\n lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +\n lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];\n // .toLowerCase() flattens concatenated strings to save heap memory space.\n return uuid.toLowerCase();\n}\n","import { generateUUID } from \"../utilities/uuid_generator\";\n\nexport abstract class Node {\n public readonly uuid = generateUUID();\n\n public abstract get type(): string;\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var 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 x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var 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 s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n 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 out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n 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]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();","import { mat4, vec3 } from \"gl-matrix\";\n\nexport class Box3 {\n public min: vec3;\n public max: vec3;\n\n /**\n * Initializes as an empty box if no values are provided using the\n * \"empty-by-sentinel\" pattern: min = +Infinity, max = -Infinity.\n * This allows expansion functions to work without special-casing\n * the first element, and avoids biasing toward (0,0,0).\n */\n constructor(min?: vec3, max?: vec3) {\n this.min = min\n ? vec3.clone(min)\n : vec3.fromValues(+Infinity, +Infinity, +Infinity);\n this.max = max\n ? vec3.clone(max)\n : vec3.fromValues(-Infinity, -Infinity, -Infinity);\n }\n\n public clone() {\n return new Box3(this.min, this.max);\n }\n\n public isEmpty(): boolean {\n return (\n this.max[0] <= this.min[0] ||\n this.max[1] <= this.min[1] ||\n this.max[2] <= this.min[2]\n );\n }\n\n // Half-open interval intersection: returns true only if boxes overlap.\n public static intersects(a: Box3, b: Box3): boolean {\n if (a.max[0] <= b.min[0] || a.min[0] >= b.max[0]) return false;\n if (a.max[1] <= b.min[1] || a.min[1] >= b.max[1]) return false;\n if (a.max[2] <= b.min[2] || a.min[2] >= b.max[2]) return false;\n return true;\n }\n\n public expandWithPoint(p: vec3) {\n if (p[0] < this.min[0]) this.min[0] = p[0];\n if (p[1] < this.min[1]) this.min[1] = p[1];\n if (p[2] < this.min[2]) this.min[2] = p[2];\n if (p[0] > this.max[0]) this.max[0] = p[0];\n if (p[1] > this.max[1]) this.max[1] = p[1];\n if (p[2] > this.max[2]) this.max[2] = p[2];\n }\n\n public applyTransform(matrix: mat4) {\n const { min, max } = this;\n const corners: vec3[] = [\n vec3.fromValues(min[0], min[1], min[2]),\n vec3.fromValues(min[0], min[1], max[2]),\n vec3.fromValues(min[0], max[1], min[2]),\n vec3.fromValues(min[0], max[1], max[2]),\n vec3.fromValues(max[0], min[1], min[2]),\n vec3.fromValues(max[0], min[1], max[2]),\n vec3.fromValues(max[0], max[1], min[2]),\n vec3.fromValues(max[0], max[1], max[2]),\n ];\n\n // \"Empty\" box before expanding\n this.min = vec3.fromValues(+Infinity, +Infinity, +Infinity);\n this.max = vec3.fromValues(-Infinity, -Infinity, -Infinity);\n\n const tmp = vec3.create();\n for (const c of corners) {\n vec3.transformMat4(tmp, c, matrix);\n this.expandWithPoint(tmp);\n }\n }\n}\n","import { Node } from \"./node\";\nimport { Box3 } from \"../math/box3\";\nimport { vec3 } from \"gl-matrix\";\n\nexport type Primitive = \"triangles\" | \"points\" | \"lines\";\n\ntype GeometryAttributeType =\n | \"position\"\n | \"normal\"\n | \"uv\"\n | \"next_position\"\n | \"previous_position\"\n | \"direction\"\n | \"path_proportion\"\n | \"color\"\n | \"size\"\n | \"marker\";\n\nexport const GeometryAttributeIndex: Record<GeometryAttributeType, number> = {\n position: 0,\n normal: 1,\n uv: 2,\n next_position: 3,\n previous_position: 4,\n direction: 5,\n path_proportion: 6,\n color: 7,\n size: 8,\n marker: 9,\n};\n\ntype GeometryAttribute = {\n type: GeometryAttributeType;\n itemSize: number;\n offset: number;\n};\n\nexport class Geometry extends Node {\n private boundingBox_: Box3 | null = null;\n protected primitive_: Primitive;\n protected attributes_: GeometryAttribute[];\n protected vertexData_: Float32Array;\n protected indexData_: Uint32Array;\n\n constructor(\n vertexData: number[] = [],\n indexData: number[] = [],\n primitive: Primitive = \"triangles\"\n ) {\n super();\n this.vertexData_ = new Float32Array(vertexData);\n this.indexData_ = new Uint32Array(indexData);\n this.primitive_ = primitive;\n this.attributes_ = [];\n }\n\n public addAttribute(attr: GeometryAttribute) {\n this.attributes_.push(attr);\n this.boundingBox_ = null;\n }\n\n public get vertexCount() {\n return this.vertexData_.byteLength / this.strideBytes;\n }\n\n public get stride() {\n return this.attributes_.reduce((acc, curr) => {\n return acc + curr.itemSize;\n }, 0);\n }\n\n public get strideBytes() {\n return this.stride * Float32Array.BYTES_PER_ELEMENT;\n }\n\n public get primitive() {\n return this.primitive_;\n }\n\n public get vertexData() {\n return this.vertexData_;\n }\n\n public get indexData() {\n return this.indexData_;\n }\n\n public get attributes() {\n return this.attributes_;\n }\n\n public get boundingBox() {\n if (this.boundingBox_ === null) {\n const attr = this.getAttribute(\"position\");\n if (!attr || this.vertexCount === 0) {\n throw new Error(\"Failed to generate bounding box\");\n }\n\n const offset = (attr.offset ?? 0) / Float32Array.BYTES_PER_ELEMENT;\n const box = new Box3();\n const point = vec3.create();\n for (let i = 0; i < this.vertexData_.length; i += this.stride) {\n point[0] = this.vertexData_[i + offset + 0];\n point[1] = this.vertexData_[i + offset + 1];\n point[2] = this.vertexData_[i + offset + 2];\n box.expandWithPoint(point);\n }\n\n this.boundingBox_ = box;\n }\n return this.boundingBox_;\n }\n\n public get type() {\n return \"Geometry\";\n }\n\n private getAttribute(type: GeometryAttributeType) {\n return this.attributes_.find((a) => a.type === type);\n }\n}\n","import { Geometry, GeometryAttributeIndex } from \"../core/geometry\";\n\ntype BufferHandles = {\n vao: WebGLVertexArrayObject;\n vbo: WebGLBuffer;\n ebo?: WebGLBuffer;\n};\n\nexport class WebGLBuffers {\n private readonly gl_: WebGL2RenderingContext;\n private readonly buffers_: Map<Geometry, BufferHandles> = new Map();\n private currentGeometry_: Geometry | null = null;\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n }\n\n public bindGeometry(geometry: Geometry) {\n if (this.alreadyActive(geometry)) return;\n\n if (!this.buffers_.has(geometry)) {\n this.generateBuffers(geometry);\n }\n\n const buffers = this.buffers_.get(geometry);\n if (!buffers) {\n throw new Error(\"Failed to retrieve buffer handles for object\");\n }\n\n this.gl_.bindVertexArray(buffers.vao);\n this.currentGeometry_ = geometry;\n }\n\n public disposeObject(geometry: Geometry) {\n const buffers = this.buffers_.get(geometry);\n if (!buffers) return;\n\n this.gl_.deleteVertexArray(buffers.vao);\n this.gl_.deleteBuffer(buffers.vbo);\n\n if (buffers.ebo) this.gl_.deleteBuffer(buffers.ebo);\n\n this.buffers_.delete(geometry);\n if (this.currentGeometry_ === geometry) {\n this.currentGeometry_ = null;\n }\n }\n\n public disposeAll() {\n for (const geometry of this.buffers_.keys()) {\n this.disposeObject(geometry);\n }\n }\n\n private alreadyActive(geometry: Geometry) {\n return this.currentGeometry_ === geometry;\n }\n\n private generateBuffers(geometry: Geometry) {\n const vao = this.gl_.createVertexArray();\n if (!vao) {\n throw new Error(\"Failed to create vertex array object (VAO)\");\n }\n\n this.gl_.bindVertexArray(vao);\n\n const { vertexData } = geometry;\n const vboType = this.gl_.ARRAY_BUFFER;\n const vbo = this.gl_.createBuffer();\n if (!vbo) throw new Error(\"Failed to create vertex buffer (VBO)\");\n\n this.gl_.bindBuffer(vboType, vbo);\n this.gl_.bufferData(vboType, vertexData, this.gl_.STATIC_DRAW);\n\n const { attributes, strideBytes } = geometry;\n attributes.forEach((attr) => {\n const idx = GeometryAttributeIndex[attr.type];\n this.gl_.vertexAttribPointer(\n idx,\n attr.itemSize,\n this.gl_.FLOAT,\n false,\n strideBytes,\n attr.offset\n );\n this.gl_.enableVertexAttribArray(idx);\n });\n\n const buffers: BufferHandles = { vao, vbo };\n\n const { indexData } = geometry;\n if (indexData.length) {\n const eboType = this.gl_.ELEMENT_ARRAY_BUFFER;\n const ebo = this.gl_.createBuffer();\n if (!ebo) throw new Error(\"Failed to create index buffer (EBO)\");\n\n this.gl_.bindBuffer(eboType, ebo);\n this.gl_.bufferData(eboType, indexData, this.gl_.STATIC_DRAW);\n buffers.ebo = ebo;\n }\n\n this.buffers_.set(geometry, buffers);\n this.gl_.bindVertexArray(null);\n }\n}\n","import { Logger } from \"../utilities/logger\";\nimport {\n Texture,\n TextureFilter,\n TextureWrapMode,\n TextureDataType,\n TextureDataFormat,\n} from \"../objects/textures/texture\";\n\nimport { Texture2D } from \"../objects/textures/texture_2d\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { Texture3D } from \"../objects/textures/texture_3d\";\n\ntype TextureFormatInfo = {\n internalFormat: number;\n format: number;\n type: number;\n};\n\nexport class WebGLTextures {\n private readonly gl_: WebGL2RenderingContext;\n private readonly textures_: Map<Texture, WebGLTexture> = new Map();\n private currentTexture_: Texture | null = null;\n private readonly maxTextureUnits_: number;\n private gpuTextureBytes_ = 0;\n private textureCount_ = 0;\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n this.maxTextureUnits_ = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n }\n\n public bindTexture(texture: Texture, index: number) {\n if (this.alreadyActive(texture)) return;\n\n if (index < 0 || index >= this.maxTextureUnits_) {\n throw new Error(\n `Texture index ${index} must be in [0, ${this.maxTextureUnits_ - 1}]`\n );\n }\n this.gl_.activeTexture(this.gl_.TEXTURE0 + index);\n\n const textureType = this.getTextureType(texture);\n const info = this.getDataFormatInfo(texture.dataFormat, texture.dataType);\n\n if (!this.textures_.has(texture)) {\n this.generateTexture(texture, info, textureType);\n }\n\n const textureId = this.textures_.get(texture);\n if (!textureId) {\n throw new Error(\"Failed to retrieve texture ID\");\n }\n\n this.gl_.bindTexture(textureType, textureId);\n if (texture.needsUpdate && texture.data !== null) {\n this.configureTextureParameters(texture, textureType);\n this.uploadTextureData(texture, info, textureType);\n texture.needsUpdate = false;\n }\n\n this.currentTexture_ = texture;\n }\n\n public disposeTexture(texture: Texture) {\n const id = this.textures_.get(texture);\n if (id) {\n this.gl_.deleteTexture(id);\n this.textures_.delete(texture);\n if (this.currentTexture_ === texture) {\n this.currentTexture_ = null;\n }\n\n const info = this.getDataFormatInfo(texture.dataFormat, texture.dataType);\n const bytes = this.computeStorageBytes(texture, info);\n this.gpuTextureBytes_ = Math.max(0, this.gpuTextureBytes_ - bytes);\n this.textureCount_ = Math.max(0, this.textureCount_ - 1);\n }\n }\n\n public disposeAll() {\n for (const texture of Array.from(this.textures_.keys())) {\n this.disposeTexture(texture);\n }\n this.gpuTextureBytes_ = 0;\n this.textureCount_ = 0;\n }\n\n public get textureInfo() {\n return {\n textures: this.textureCount_,\n totalBytes: this.gpuTextureBytes_,\n };\n }\n\n private alreadyActive(texture: Texture) {\n return this.currentTexture_ === texture && !texture.needsUpdate;\n }\n\n private generateTexture(\n texture: Texture,\n info: TextureFormatInfo,\n type: number\n ) {\n const textureId = this.gl_.createTexture();\n if (!textureId) throw new Error(\"Failed to create texture\");\n\n this.gl_.bindTexture(type, textureId);\n\n if (this.isTexture2D(texture)) {\n this.gl_.texStorage2D(\n type,\n texture.mipmapLevels,\n info.internalFormat,\n texture.width,\n texture.height\n );\n } else if (this.isTextureStorage3D(texture)) {\n this.gl_.texStorage3D(\n type,\n texture.mipmapLevels,\n info.internalFormat,\n texture.width,\n texture.height,\n texture.depth\n );\n } else {\n throw new Error(`Unknown texture type ${texture.type}`);\n }\n\n this.gpuTextureBytes_ += this.computeStorageBytes(texture, info);\n this.textureCount_ += 1;\n this.textures_.set(texture, textureId);\n this.gl_.bindTexture(type, null);\n }\n\n private configureTextureParameters(texture: Texture, type: number) {\n const gl = this.gl_;\n const minFilter = this.getFilter(texture.minFilter, texture);\n const maxFilter = this.getFilter(texture.maxFilter, texture);\n\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, maxFilter);\n gl.texParameteri(type, gl.TEXTURE_WRAP_S, this.getWrapMode(texture.wrapS));\n gl.texParameteri(type, gl.TEXTURE_WRAP_T, this.getWrapMode(texture.wrapT));\n gl.texParameteri(type, gl.TEXTURE_WRAP_R, this.getWrapMode(texture.wrapR));\n }\n\n private uploadTextureData(\n texture: Texture,\n info: TextureFormatInfo,\n type: number\n ) {\n // Only base level (0) is updated; mipmaps are not supported.\n const mipmapLevel = 0;\n\n // Zero offsets because entire dataset is overwritten.\n const offset = { x: 0, y: 0, z: 0 };\n\n if (this.isTexture2D(texture)) {\n this.gl_.texSubImage2D(\n type,\n mipmapLevel,\n offset.x,\n offset.y,\n texture.width,\n texture.height,\n info.format,\n info.type,\n // This function has multiple overloads. We are temporarily casting it to\n // ArrayBufferView to ensure the correct overload is called. Once we\n // consolidate Texture2D and DataTexture2D, we can remove this cast.\n // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texSubImage2D#syntax\n texture.data as ArrayBufferView\n );\n } else if (this.isTextureStorage3D(texture)) {\n this.gl_.texSubImage3D(\n type,\n mipmapLevel,\n offset.x,\n offset.y,\n offset.z,\n texture.width,\n texture.height,\n texture.depth,\n info.format,\n info.type,\n texture.data as ArrayBufferView\n );\n } else {\n throw new Error(\n \"Attempting to upload data for an unsupported texture type\"\n );\n }\n }\n\n private getFilter(filter: TextureFilter, texture: Texture) {\n const { dataFormat, dataType } = texture;\n if (\n dataFormat === \"scalar\" &&\n dataType !== \"float\" &&\n filter !== \"nearest\"\n ) {\n Logger.warn(\n \"WebGLTexture\",\n \"Integer values are not filterable. Using gl.NEAREST instead.\"\n );\n return this.gl_.NEAREST;\n }\n // prettier-ignore\n switch (filter) {\n case \"nearest\": return this.gl_.NEAREST;\n case \"linear\": return this.gl_.LINEAR;\n default: throw new Error(`Unsupported texture filter: ${filter}`);\n }\n }\n\n private getTextureType(texture: Texture) {\n if (this.isTexture2D(texture)) return this.gl_.TEXTURE_2D;\n if (this.isTexture2DArray(texture)) return this.gl_.TEXTURE_2D_ARRAY;\n if (this.isTexture3D(texture)) return this.gl_.TEXTURE_3D;\n throw new Error(`Unknown texture type ${texture.type}`);\n }\n\n private getWrapMode(mode: TextureWrapMode) {\n // prettier-ignore\n switch (mode) {\n case \"repeat\": return this.gl_.REPEAT;\n case \"clamp_to_edge\": return this.gl_.CLAMP_TO_EDGE;\n default: throw new Error(`Unsupported wrap mode: ${mode}`);\n }\n }\n\n private getDataFormatInfo(\n format: TextureDataFormat,\n type: TextureDataType\n ): TextureFormatInfo {\n if (format === \"rgba\" && type === \"unsigned_byte\") {\n return {\n internalFormat: this.gl_.RGBA8,\n format: this.gl_.RGBA,\n type: this.gl_.UNSIGNED_BYTE,\n };\n }\n if (format === \"rgb\" && type === \"unsigned_byte\") {\n return {\n internalFormat: this.gl_.RGB8,\n format: this.gl_.RGB,\n type: this.gl_.UNSIGNED_BYTE,\n };\n }\n if (format === \"scalar\") {\n switch (type) {\n case \"byte\":\n return {\n internalFormat: this.gl_.R8I,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.BYTE,\n };\n case \"short\":\n return {\n internalFormat: this.gl_.R16I,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.SHORT,\n };\n case \"int\":\n return {\n internalFormat: this.gl_.R32I,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.INT,\n };\n case \"unsigned_byte\":\n return {\n internalFormat: this.gl_.R8UI,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.UNSIGNED_BYTE,\n };\n case \"unsigned_short\":\n return {\n internalFormat: this.gl_.R16UI,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.UNSIGNED_SHORT,\n };\n case \"unsigned_int\":\n return {\n internalFormat: this.gl_.R32UI,\n format: this.gl_.RED_INTEGER,\n type: this.gl_.UNSIGNED_INT,\n };\n case \"float\":\n return {\n internalFormat: this.gl_.R32F,\n format: this.gl_.RED,\n type: this.gl_.FLOAT,\n };\n default:\n throw new Error(`Unsupported scalar type: ${type}`);\n }\n }\n throw new Error(`Unsupported format/type: ${format}/${type}`);\n }\n\n private computeStorageBytes(\n texture: Texture,\n info: TextureFormatInfo\n ): number {\n const bytes = this.bytesPerTexel(info);\n const levels = Math.max(1, texture.mipmapLevels);\n const depth = this.isTextureStorage3D(texture)\n ? Math.max(1, texture.depth)\n : 1;\n\n let width = Math.max(1, texture.width);\n let height = Math.max(1, texture.height);\n let total = 0;\n for (let level = 0; level < levels; level++) {\n total += width * height * depth * bytes;\n width = Math.max(1, width >> 1);\n height = Math.max(1, height >> 1);\n }\n\n return total;\n }\n\n private bytesPerTexel(info: TextureFormatInfo): number {\n const gl = this.gl_;\n if (info.format === gl.RGB && info.type === gl.UNSIGNED_BYTE) return 3;\n if (info.format === gl.RGBA && info.type === gl.UNSIGNED_BYTE) return 4;\n if (info.format === gl.RED_INTEGER) {\n switch (info.type) {\n case gl.BYTE:\n case gl.UNSIGNED_BYTE:\n return 1;\n case gl.SHORT:\n case gl.UNSIGNED_SHORT:\n return 2;\n case gl.INT:\n case gl.UNSIGNED_INT:\n return 4;\n }\n }\n if (info.format === gl.RED && info.type === gl.FLOAT) return 4;\n\n throw new Error(\"bytesPerTexel: unsupported format/type\");\n }\n\n private isTextureStorage3D(\n texture: Texture\n ): texture is Texture2DArray | Texture3D {\n return this.isTexture2DArray(texture) || this.isTexture3D(texture);\n }\n\n private isTexture2D(texture: Texture): texture is Texture2D {\n return texture.type === \"Texture2D\";\n }\n\n private isTexture2DArray(texture: Texture): texture is Texture2DArray {\n return texture.type === \"Texture2DArray\";\n }\n\n private isTexture3D(texture: Texture): texture is Texture3D {\n return texture.type === \"Texture3D\";\n }\n}\n","import { vec2 } from \"gl-matrix\";\n\nexport class Box2 {\n public min: vec2;\n public max: vec2;\n\n /**\n * Initializes as an empty box if no values are provided using the\n * \"empty-by-sentinel\" pattern: min = +Infinity, max = -Infinity.\n * This allows expansion functions to work without special-casing\n * the first element, and avoids biasing toward (0,0).\n */\n constructor(min?: vec2, max?: vec2) {\n this.min = min ? vec2.clone(min) : vec2.fromValues(+Infinity, +Infinity);\n this.max = max ? vec2.clone(max) : vec2.fromValues(-Infinity, -Infinity);\n }\n\n public clone() {\n return new Box2(this.min, this.max);\n }\n\n public isEmpty(): boolean {\n return this.max[0] <= this.min[0] || this.max[1] <= this.min[1];\n }\n\n // Half-open interval intersection: returns true only if boxes overlap.\n public static intersects(a: Box2, b: Box2): boolean {\n if (a.max[0] <= b.min[0] || a.min[0] >= b.max[0]) return false;\n if (a.max[1] <= b.min[1] || a.min[1] >= b.max[1]) return false;\n return true;\n }\n\n public static equals(a: Box2, b: Box2): boolean {\n return vec2.exactEquals(a.min, b.min) && vec2.exactEquals(a.max, b.max);\n }\n\n public floor(): Box2 {\n return new Box2(\n vec2.fromValues(Math.floor(this.min[0]), Math.floor(this.min[1])),\n vec2.fromValues(Math.floor(this.max[0]), Math.floor(this.max[1]))\n );\n }\n\n public toRect(): { x: number; y: number; width: number; height: number } {\n const x = this.min[0];\n const y = this.min[1];\n const width = this.max[0] - this.min[0];\n const height = this.max[1] - this.min[1];\n return { x, y, width, height };\n }\n}\n","import { Box2 } from \"../math/box2\";\n\nexport type BlendingMode =\n | \"none\"\n | \"normal\"\n | \"additive\"\n | \"multiply\"\n | \"subtractive\";\n\nexport type CullingMode = \"none\" | \"front\" | \"back\" | \"both\";\n\nexport class WebGLState {\n private readonly gl_: WebGL2RenderingContext;\n\n private enabledCapabilities_ = new Map<GLenum, boolean>();\n private depthMaskEnabled_: boolean | null = null;\n private blendSrcFactor_: GLenum | null = null;\n private blendDstFactor_: GLenum | null = null;\n private currentBlendingMode_: BlendingMode | null = null;\n private currentViewport_: Box2 | null = null;\n private currentScissor_: Box2 | null = null;\n private currentCullingMode_: CullingMode | null = null;\n\n constructor(gl: WebGL2RenderingContext) {\n this.gl_ = gl;\n }\n\n private enable(cap: GLenum) {\n if (!this.enabledCapabilities_.get(cap)) {\n this.gl_.enable(cap);\n this.enabledCapabilities_.set(cap, true);\n }\n }\n\n private disable(cap: GLenum) {\n if (this.enabledCapabilities_.get(cap)) {\n this.gl_.disable(cap);\n this.enabledCapabilities_.set(cap, false);\n }\n }\n\n private setBlendFunc(src: GLenum, dst: GLenum) {\n if (this.blendSrcFactor_ !== src || this.blendDstFactor_ !== dst) {\n this.gl_.blendFunc(src, dst);\n this.blendSrcFactor_ = src;\n this.blendDstFactor_ = dst;\n }\n }\n\n public setDepthTesting(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.DEPTH_TEST);\n } else {\n this.disable(this.gl_.DEPTH_TEST);\n }\n }\n\n public setBlending(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.BLEND);\n } else {\n this.disable(this.gl_.BLEND);\n }\n }\n\n public setDepthMask(flag: boolean) {\n if (this.depthMaskEnabled_ !== flag) {\n this.gl_.depthMask(flag);\n this.depthMaskEnabled_ = flag;\n }\n }\n\n public setBlendingMode(mode: BlendingMode) {\n if (this.currentBlendingMode_ === mode) return;\n\n if (mode === \"none\") {\n this.setBlending(false);\n } else {\n this.setBlending(true);\n switch (mode) {\n case \"additive\":\n this.setBlendFunc(this.gl_.SRC_ALPHA, this.gl_.ONE);\n break;\n case \"multiply\":\n this.setBlendFunc(this.gl_.DST_COLOR, this.gl_.ZERO);\n break;\n case \"subtractive\":\n this.setBlendFunc(this.gl_.ZERO, this.gl_.ONE_MINUS_SRC_COLOR);\n break;\n case \"normal\":\n default:\n this.setBlendFunc(this.gl_.SRC_ALPHA, this.gl_.ONE_MINUS_SRC_ALPHA);\n break;\n }\n }\n this.currentBlendingMode_ = mode;\n }\n\n public setViewport(box: Box2) {\n const clampedBox = box.floor();\n\n if (\n this.currentViewport_ &&\n Box2.equals(clampedBox, this.currentViewport_)\n ) {\n return;\n }\n const { x, y, width, height } = clampedBox.toRect();\n this.gl_.viewport(x, y, width, height);\n this.currentViewport_ = clampedBox;\n }\n\n public setScissorTest(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.SCISSOR_TEST);\n } else {\n this.disable(this.gl_.SCISSOR_TEST);\n this.currentScissor_ = null;\n }\n }\n\n public setScissor(box: Box2) {\n const clampedBox = box.floor();\n\n if (this.currentScissor_ && Box2.equals(clampedBox, this.currentScissor_)) {\n return;\n }\n const { x, y, width, height } = clampedBox.toRect();\n this.gl_.scissor(x, y, width, height);\n this.currentScissor_ = clampedBox;\n }\n\n public setCullFace(enabled: boolean) {\n if (enabled) {\n this.enable(this.gl_.CULL_FACE);\n } else {\n this.disable(this.gl_.CULL_FACE);\n }\n }\n\n public setCullFaceMode(mode: CullingMode) {\n if (this.currentCullingMode_ === mode) return;\n\n if (mode === \"none\") {\n this.setCullFace(false);\n } else {\n this.setCullFace(true);\n switch (mode) {\n case \"front\":\n this.gl_.cullFace(this.gl_.FRONT);\n break;\n case \"back\":\n this.gl_.cullFace(this.gl_.BACK);\n break;\n case \"both\":\n this.gl_.cullFace(this.gl_.FRONT_AND_BACK);\n break;\n }\n }\n\n this.currentCullingMode_ = mode;\n }\n}\n","import { Renderer } from \"../core/renderer\";\nimport { WebGLShaderProgram } from \"./webgl_shader_program\";\nimport { WebGLShaderPrograms } from \"./webgl_shader_programs\";\nimport { Logger } from \"../utilities/logger\";\n\nimport { WebGLBuffers } from \"./webgl_buffers\";\nimport { WebGLTextures } from \"./webgl_textures\";\n\nimport { Layer } from \"../core/layer\";\nimport { WebGLState } from \"./WebGLState\";\nimport { RenderableObject } from \"../core/renderable_object\";\nimport { Geometry, Primitive } from \"../core/geometry\";\nimport { Box2 } from \"../math/box2\";\nimport { Viewport } from \"../core/viewport\";\nimport { Camera } from \"../objects/cameras/camera\";\n\nimport { mat4, vec2 } from \"gl-matrix\";\nimport { Frustum } from \"../math/frustum\";\n\n// The library's coordinate system is left-handed.\n// With the default camera, the standard basis vectors should\n// look as follows.\n// (1, 0, 0) points to the right of the screen\n// (0, 1, 0) points to the bottom of the screen\n// (0, 0, 1) points out of the screen\n// WebGL's coordinate system is right-handed where the vectors\n// point in the same directions except that\n// (0, 1, 0) points to the top of the screen\n// Therefore, this transform makes the appropriate flip in y.\nconst axisDirection = mat4.fromScaling(mat4.create(), [1, -1, 1]);\n\nexport class WebGLRenderer extends Renderer {\n private readonly gl_: WebGL2RenderingContext | null = null;\n private readonly programs_: WebGLShaderPrograms;\n private readonly bindings_: WebGLBuffers;\n private readonly textures_: WebGLTextures;\n private readonly state_: WebGLState;\n private renderedObjectsPerFrame_ = 0;\n\n constructor(canvas: HTMLCanvasElement) {\n super(canvas);\n\n this.gl_ = this.canvas.getContext(\"webgl2\", {\n depth: true,\n antialias: true,\n });\n if (!this.gl_) {\n throw new Error(`Failed to initialize WebGL2 context`);\n }\n Logger.info(\n \"WebGLRenderer\",\n `WebGL version ${this.gl.getParameter(this.gl.VERSION)}`\n );\n\n this.programs_ = new WebGLShaderPrograms(this.gl);\n this.bindings_ = new WebGLBuffers(this.gl);\n this.textures_ = new WebGLTextures(this.gl);\n this.state_ = new WebGLState(this.gl);\n this.resize(this.canvas.width, this.canvas.height);\n }\n\n public render(viewport: Viewport) {\n const viewportBox = viewport.getBoxRelativeTo(this.canvas);\n const rendererBox = new Box2(\n vec2.fromValues(0, 0),\n vec2.fromValues(this.width, this.height)\n );\n if (Box2.equals(viewportBox.floor(), rendererBox.floor())) {\n this.state_.setScissorTest(false);\n } else if (Box2.intersects(viewportBox, rendererBox)) {\n this.state_.setScissor(viewportBox);\n this.state_.setScissorTest(true);\n } else {\n Logger.warn(\n \"WebGLRenderer\",\n `Viewport ${viewport.id} is entirely outside canvas bounds, skipping render`\n );\n return;\n }\n this.state_.setViewport(viewportBox);\n this.renderedObjectsPerFrame_ = 0;\n this.clear();\n\n const { opaque, transparent } = viewport.layerManager.partitionLayers();\n\n this.state_.setDepthMask(true);\n\n const frustum = viewport.camera.frustum;\n const renderContext = { viewport };\n\n for (const layer of opaque) {\n layer.update(renderContext);\n if (layer.state === \"ready\") {\n this.renderLayer(layer, viewport.camera, frustum);\n }\n }\n\n this.state_.setDepthMask(false);\n for (const layer of transparent) {\n layer.update(renderContext);\n if (layer.state !== \"ready\") continue;\n this.renderLayer(layer, viewport.camera, frustum);\n }\n this.state_.setDepthMask(true);\n\n this.renderedObjects_ = this.renderedObjectsPerFrame_;\n }\n\n public get textureInfo() {\n return this.textures_.textureInfo;\n }\n\n private renderLayer(layer: Layer, camera: Camera, frustum: Frustum) {\n this.state_.setBlendingMode(layer.transparent ? layer.blendMode : \"none\");\n\n layer.objects.forEach((object, i) => {\n if (frustum.intersectsWithBox3(object.boundingBox)) {\n this.renderObject(layer, i, camera);\n this.renderedObjectsPerFrame_ += 1;\n }\n });\n }\n\n protected renderObject(layer: Layer, objectIndex: number, camera: Camera) {\n const object = layer.objects[objectIndex];\n this.state_.setCullFaceMode(object.cullFaceMode);\n this.bindings_.bindGeometry(object.geometry);\n object.popStaleTextures().forEach((texture) => {\n this.textures_.disposeTexture(texture);\n });\n object.textures.forEach((texture, index) => {\n this.textures_.bindTexture(texture, index);\n });\n\n const program = this.programs_.use(object.programName);\n this.drawGeometry(object.geometry, object, layer, program, camera);\n\n if (object.wireframeEnabled) {\n this.bindings_.bindGeometry(object.wireframeGeometry);\n const wireframeProgram = this.programs_.use(\"wireframe\");\n wireframeProgram.setUniform(\"u_color\", object.wireframeColor.rgb);\n this.drawGeometry(\n object.wireframeGeometry,\n object,\n layer,\n wireframeProgram,\n camera\n );\n }\n }\n\n private drawGeometry(\n geometry: Geometry,\n object: RenderableObject,\n layer: Layer,\n program: WebGLShaderProgram,\n camera: Camera\n ) {\n const modelView = mat4.multiply(\n mat4.create(),\n camera.viewMatrix,\n object.transform.matrix\n );\n const projection = mat4.multiply(\n mat4.create(),\n axisDirection,\n camera.projectionMatrix\n );\n const resolution = [this.canvas.width, this.canvas.height];\n\n const objectUniforms = object.getUniforms();\n for (const uniformName of program.uniformNames) {\n switch (uniformName) {\n case \"ModelView\":\n program.setUniform(uniformName, modelView);\n break;\n case \"Projection\":\n program.setUniform(uniformName, projection);\n break;\n case \"Resolution\":\n program.setUniform(uniformName, resolution);\n break;\n case \"u_opacity\":\n program.setUniform(uniformName, layer.opacity);\n break;\n default:\n if (uniformName in objectUniforms) {\n program.setUniform(uniformName, objectUniforms[uniformName]);\n }\n }\n }\n\n const primitive = this.glGetPrimitive(geometry.primitive);\n const index = geometry.indexData;\n if (index.length) {\n this.gl.drawElements(primitive, index.length, this.gl.UNSIGNED_INT, 0);\n } else {\n this.gl.drawArrays(primitive, 0, geometry.vertexCount);\n }\n }\n\n private glGetPrimitive(type: Primitive) {\n switch (type) {\n case \"points\":\n return this.gl.POINTS;\n case \"triangles\":\n return this.gl.TRIANGLES;\n case \"lines\":\n return this.gl.LINES;\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unknown Primitive type: ${exhaustiveCheck}`);\n }\n }\n }\n\n protected resize(width: number, height: number) {\n const newViewport = new Box2(\n vec2.fromValues(0, 0),\n vec2.fromValues(width, height)\n );\n this.state_.setViewport(newViewport);\n }\n\n protected clear() {\n this.gl.clearColor(...this.backgroundColor.rgba);\n this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n this.state_.setDepthTesting(true);\n this.gl.depthFunc(this.gl.LEQUAL);\n }\n\n private get gl() {\n return this.gl_!;\n }\n}\n","import { Chunk } from \"./chunk\";\nimport { Logger } from \"../utilities/logger\";\n\nconst MAX_CONCURRENT = 8;\n\ntype LoaderFn = (signal: AbortSignal) => Promise<void>;\n\ntype PendingItem = { chunk: Chunk; fn: LoaderFn };\n\nexport class ChunkQueue {\n private readonly maxConcurrent_: number;\n private readonly pending_: PendingItem[] = [];\n private readonly running_ = new Map<\n Chunk,\n { controller: AbortController; promise: Promise<void> }\n >();\n\n constructor(maxConcurrent = MAX_CONCURRENT) {\n this.maxConcurrent_ = Math.max(1, maxConcurrent);\n }\n\n public enqueue(chunk: Chunk, fn: LoaderFn) {\n if (this.running_.has(chunk)) return;\n if (this.pending_.some((p) => p.chunk === chunk)) return;\n\n this.pending_.push({ chunk, fn });\n }\n\n public flush() {\n this.pump();\n }\n\n public cancel(chunk: Chunk) {\n const idx = this.pending_.findIndex((p) => p.chunk === chunk);\n if (idx >= 0) {\n this.pending_.splice(idx, 1);\n Logger.debug(\"ChunkQueue\", \"Cancelled pending request\");\n return;\n }\n\n const running = this.running_.get(chunk);\n if (running) {\n running.controller.abort();\n Logger.debug(\"ChunkQueue\", \"Cancelled fetch request\");\n }\n }\n\n public get pendingCount() {\n return this.pending_.length;\n }\n\n public get runningCount() {\n return this.running_.size;\n }\n\n private pump() {\n if (\n this.running_.size >= this.maxConcurrent_ ||\n this.pending_.length === 0\n ) {\n return;\n }\n\n this.pending_.sort((a, b) => {\n const priorityA = a.chunk.priority ?? Number.MAX_SAFE_INTEGER;\n const priorityB = b.chunk.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (priorityA === priorityB) {\n return (\n (a.chunk.orderKey ?? Number.MAX_SAFE_INTEGER) -\n (b.chunk.orderKey ?? Number.MAX_SAFE_INTEGER)\n );\n }\n\n return priorityA - priorityB;\n });\n\n while (\n this.running_.size < this.maxConcurrent_ &&\n this.pending_.length > 0\n ) {\n this.start(this.pending_.shift()!);\n }\n }\n\n private start(item: PendingItem) {\n const { chunk, fn } = item;\n chunk.state = \"loading\";\n\n const controller = new AbortController();\n const promise = Promise.resolve()\n .then(() => fn(controller.signal))\n .then(\n () => {\n if (chunk.state === \"loading\") chunk.state = \"loaded\";\n },\n (err) => {\n if (chunk.state === \"loading\") chunk.state = \"unloaded\";\n if (err.name !== \"AbortError\") {\n Logger.error(\"ChunkQueue\", String(err));\n }\n }\n )\n .finally(() => {\n this.running_.delete(chunk);\n this.pump();\n });\n\n this.running_.set(chunk, { controller, promise });\n }\n}\n","import { Region } from \"./region\";\nimport { TextureUnpackRowAlignment } from \"../objects/textures/texture\";\nimport { PromiseScheduler } from \"./promise_scheduler\";\nimport { Logger } from \"../utilities/logger\";\n\nconst chunkDataTypes = [\n Int8Array,\n Int16Array,\n Int32Array,\n Uint8Array,\n Uint16Array,\n Uint32Array,\n Float32Array,\n] as const;\nexport type ChunkDataConstructor = (typeof chunkDataTypes)[number];\nexport type ChunkData = InstanceType<ChunkDataConstructor>;\n\nexport function isChunkData(value: unknown): value is ChunkData {\n if (chunkDataTypes.some((ChunkData) => value instanceof ChunkData)) {\n return true;\n }\n const supportedDataTypeNames = chunkDataTypes.map((dtype) => dtype.name);\n Logger.debug(\n \"Chunk\",\n `Unsupported chunk data type: ${value}. Supported data types: ${supportedDataTypeNames}`\n );\n return false;\n}\n\nexport type ChunkViewState = {\n visible: boolean;\n prefetch: boolean;\n priority: number | null;\n orderKey: number | null;\n};\n\nexport type Chunk = {\n data?: ChunkData;\n state: \"unloaded\" | \"queued\" | \"loading\" | \"loaded\";\n lod: number;\n shape: {\n x: number;\n y: number;\n z: number;\n c: number;\n };\n rowAlignmentBytes: TextureUnpackRowAlignment;\n chunkIndex: {\n x: number;\n y: number;\n z: number;\n c: number;\n t: number;\n };\n scale: {\n x: number;\n y: number;\n z: number;\n };\n offset: {\n x: number;\n y: number;\n z: number;\n };\n} & ChunkViewState;\n\n// Maps Idetik spatial dimensions (x, y, z) and non-spatial dimensions (c, t)\n// dimensions to a chunk source's dimensions.\nexport type SourceDimensionMap = {\n x: SourceDimension;\n y: SourceDimension;\n z?: SourceDimension;\n c?: SourceDimension;\n t?: SourceDimension;\n numLods: number;\n};\n\n// A dimension in a chunk source with multiple levels of detail (LODs).\nexport type SourceDimension = {\n name: string;\n index: number;\n unit?: string;\n lods: SourceDimensionLod[];\n};\n\n// Metadata for a source dimension at a specific level of detail (LOD)\n// of a multi-resolution image pyramid.\n// For example, combines zarr array metadata (size, chunkSize) with\n// OME-zarr coordinate transform (scale, translation).\nexport type SourceDimensionLod = {\n size: number;\n chunkSize: number;\n scale: number;\n translation: number;\n};\n\nexport type SliceCoordinates = {\n z?: number;\n c?: number;\n t?: number;\n};\n\nexport type ChunkSource = {\n open(): Promise<ChunkLoader>;\n};\n\nexport type ChunkLoader = {\n loadRegion(\n input: Region,\n lod: number,\n scheduler?: PromiseScheduler\n ): Promise<Chunk>;\n\n getSourceDimensionMap(): SourceDimensionMap;\n\n loadChunkData(chunk: Chunk, signal: AbortSignal): Promise<void>;\n};\n\nexport function coordToIndex(lod: SourceDimensionLod, coord: number): number {\n return Math.round((coord - lod.translation) / lod.scale);\n}\n\nexport function coordToChunkIndex(\n lod: SourceDimensionLod,\n coord: number\n): number {\n const index = coordToIndex(lod, coord);\n return Math.floor(index / lod.chunkSize);\n}\n","export function almostEqual(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n","import {\n Chunk,\n SourceDimensionMap,\n ChunkLoader,\n SliceCoordinates,\n coordToIndex,\n} from \"../data/chunk\";\nimport { almostEqual } from \"../utilities/almost_equal\";\n\nexport class ChunkStore {\n private readonly chunks_: Chunk[][];\n private readonly loader_: ChunkLoader;\n private readonly lowestResLOD_: number;\n private readonly dimensions_: SourceDimensionMap;\n\n constructor(loader: ChunkLoader) {\n this.loader_ = loader;\n this.dimensions_ = this.loader_.getSourceDimensionMap();\n this.lowestResLOD_ = this.dimensions_.numLods - 1;\n\n this.validateXYScaleRatios();\n const { size: chunksT } = this.getAndValidateTimeDimension();\n const { size: chunksC } = this.getAndValidateChannelDimension();\n\n this.chunks_ = Array.from({ length: chunksT }, () => []);\n for (let t = 0; t < chunksT; ++t) {\n const chunksAtT = this.chunks_[t];\n for (let lod = 0; lod < this.dimensions_.numLods; ++lod) {\n const xLod = this.dimensions_.x.lods[lod];\n const yLod = this.dimensions_.y.lods[lod];\n const zLod = this.dimensions_.z?.lods[lod];\n\n const chunkWidth = xLod.chunkSize;\n const chunkHeight = yLod.chunkSize;\n const chunkDepth = zLod?.chunkSize ?? 1;\n\n const chunksX = Math.ceil(xLod.size / chunkWidth);\n const chunksY = Math.ceil(yLod.size / chunkHeight);\n const chunksZ = Math.ceil((zLod?.size ?? 1) / chunkDepth);\n\n for (let c = 0; c < chunksC; ++c) {\n for (let x = 0; x < chunksX; ++x) {\n const xOffset = xLod.translation + x * xLod.chunkSize * xLod.scale;\n for (let y = 0; y < chunksY; ++y) {\n const yOffset =\n yLod.translation + y * yLod.chunkSize * yLod.scale;\n for (let z = 0; z < chunksZ; ++z) {\n const zOffset =\n zLod !== undefined\n ? zLod.translation + z * chunkDepth * zLod.scale\n : 0;\n chunksAtT.push({\n state: \"unloaded\",\n lod,\n visible: false,\n prefetch: false,\n priority: null,\n orderKey: null,\n shape: {\n x: Math.min(chunkWidth, xLod.size - x * chunkWidth),\n y: Math.min(chunkHeight, yLod.size - y * chunkHeight),\n z: Math.min(chunkDepth, (zLod?.size ?? 1) - z * chunkDepth),\n c: 1,\n },\n rowAlignmentBytes: 1,\n chunkIndex: { x, y, z, c, t },\n scale: {\n x: xLod.scale,\n y: yLod.scale,\n z: zLod?.scale ?? 1,\n },\n offset: {\n x: xOffset,\n y: yOffset,\n z: zOffset,\n },\n });\n }\n }\n }\n }\n }\n }\n }\n\n public getChunksAtTime(timeIndex: number): Chunk[] {\n return this.chunks_[timeIndex];\n }\n\n public getTimeIndex(sliceCoords: SliceCoordinates): number {\n if (sliceCoords.t === undefined) return 0;\n if (this.dimensions_.t === undefined) return 0;\n return coordToIndex(this.dimensions_.t.lods[0], sliceCoords.t);\n }\n\n public get lodCount() {\n return this.lowestResLOD_ + 1;\n }\n\n public get dimensions() {\n return this.dimensions_;\n }\n\n public getLowestResLOD(): number {\n return this.lowestResLOD_;\n }\n\n public loadChunkData(chunk: Chunk, signal: AbortSignal) {\n return this.loader_.loadChunkData(chunk, signal);\n }\n\n private validateXYScaleRatios(): void {\n // Validates that each LOD level is downsampled by a factor of 2 in X and Y.\n // Z downsampling is not validated here because it's not guaranteed.\n const xDim = this.dimensions_.x;\n const yDim = this.dimensions_.y;\n for (let i = 1; i < this.dimensions_.numLods; i++) {\n const rx = xDim.lods[i].scale / xDim.lods[i - 1].scale;\n const ry = yDim.lods[i].scale / yDim.lods[i - 1].scale;\n\n if (!almostEqual(rx, 2, 0.02) || !almostEqual(ry, 2, 0.02)) {\n throw new Error(\n `Invalid downsampling factor between levels ${i - 1} → ${i}: ` +\n `expected (2× in X and Y), but got ` +\n `(${rx.toFixed(2)}×, ${ry.toFixed(2)}×) from scale ` +\n `[${xDim.lods[i - 1].scale}, ${yDim.lods[i - 1].scale}] → [${xDim.lods[i].scale}, ${yDim.lods[i].scale}]`\n );\n }\n }\n }\n\n private getAndValidateTimeDimension() {\n for (let lod = 0; lod < this.dimensions_.numLods; ++lod) {\n const tLod = this.dimensions_.t?.lods[lod];\n if (!tLod) continue;\n if (tLod.chunkSize !== 1) {\n throw new Error(\n `ChunkStore only supports a chunk size of 1 in t. Found ${tLod.chunkSize} at LOD ${lod}`\n );\n }\n const prevTLod = this.dimensions_.t?.lods[lod - 1];\n if (!prevTLod) continue;\n if (tLod.size !== prevTLod.size) {\n throw new Error(\n `ChunkStore does not support downsampling in t. Found ${prevTLod.size} at LOD ${lod - 1} → ${tLod.size} at LOD ${lod}`\n );\n }\n }\n return {\n size: this.dimensions_.t?.lods[0].size ?? 1,\n };\n }\n\n private getAndValidateChannelDimension() {\n for (let lod = 0; lod < this.dimensions_.numLods; ++lod) {\n const cLod = this.dimensions_.c?.lods[lod];\n if (!cLod) continue;\n if (cLod.chunkSize !== 1) {\n throw new Error(\n `ChunkStore only supports a chunk size of 1 in c. Found ${cLod.chunkSize} at LOD ${lod}`\n );\n }\n if (cLod.scale !== 1) {\n throw new Error(\n `ChunkStore does not support scale in c. Found ${cLod.scale} at LOD ${lod}`\n );\n }\n if (cLod.translation !== 0) {\n throw new Error(\n `ChunkStore does not support translation in c. Found ${cLod.translation} at LOD ${lod}`\n );\n }\n const prevCLod = this.dimensions_.c?.lods[lod - 1];\n if (!prevCLod) continue;\n if (cLod.size !== prevCLod.size) {\n throw new Error(\n `ChunkStore does not support downsampling in c. Found ${prevCLod.size} at LOD ${lod - 1} → ${cLod.size} at LOD ${lod}`\n );\n }\n }\n return {\n size: this.dimensions_.c?.lods[0].size ?? 1,\n };\n }\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { Chunk, SliceCoordinates, ChunkViewState } from \"../data/chunk\";\nimport { ChunkStore } from \"./chunk_store\";\nimport { Viewport } from \"./viewport\";\nimport { OrthographicCamera } from \"../objects/cameras/orthographic_camera\";\nimport { ImageSourcePolicy } from \"./image_source_policy\";\nimport { ReadonlyVec2, vec2, vec3 } from \"gl-matrix\";\nimport { Box2 } from \"../math/box2\";\nimport { Box3 } from \"../math/box3\";\nimport { Logger } from \"../utilities/logger\";\nimport { clamp } from \"../utilities/clamp\";\n\n/*\nUnique symbol used as a capability token to allow internal modules to update\nthe image source policy. Only code that imports this symbol can call\nsetImageSourcePolicy; all other callers will be rejected. Acts like a \"friend\"\naccess key, preventing accidental external mutation.\n*/\nexport const INTERNAL_POLICY_KEY = Symbol(\"INTERNAL_POLICY_KEY\");\n\nexport class ChunkStoreView {\n private readonly store_: ChunkStore;\n private policy_: ImageSourcePolicy;\n private policyChanged_ = false;\n private currentLOD_: number = 0;\n private lastViewBounds2D_: Box2 | null = null;\n private lastZBounds_?: [number, number];\n private lastTCoord_?: number;\n\n private sourceMaxSquareDistance2D_: number;\n private readonly chunkViewStates_: Map<Chunk, ChunkViewState> = new Map();\n\n constructor(store: ChunkStore, policy: ImageSourcePolicy) {\n this.store_ = store;\n this.policy_ = policy;\n\n Logger.info(\n \"ChunkStoreView\",\n \"Using image source policy:\",\n this.policy_.profile\n );\n\n const dimensions = this.store_.dimensions;\n const xLod0 = dimensions.x.lods[0];\n const yLod0 = dimensions.y.lods[0];\n this.sourceMaxSquareDistance2D_ = vec2.squaredLength(\n vec2.fromValues(xLod0.size * xLod0.scale, yLod0.size * yLod0.scale)\n );\n }\n\n public get store(): ChunkStore {\n return this.store_;\n }\n\n public get chunkViewStates(): ReadonlyMap<Chunk, ChunkViewState> {\n return this.chunkViewStates_;\n }\n\n public getChunksToRender(sliceCoords: SliceCoordinates): Chunk[] {\n const currentTimeIndex = this.store_.getTimeIndex(sliceCoords);\n const currentTimeChunks = this.store_.getChunksAtTime(currentTimeIndex);\n const currentLODChunks = currentTimeChunks.filter(\n (chunk) =>\n chunk.lod === this.currentLOD_ &&\n this.chunkViewStates_.get(chunk)?.visible === true &&\n chunk.state === \"loaded\"\n );\n\n // If we're at the lowest resolution LOD, only return current LOD chunks\n const lowestResLOD = this.store_.getLowestResLOD();\n if (this.currentLOD_ === lowestResLOD) {\n return currentLODChunks;\n }\n\n const lowResChunks = currentTimeChunks.filter(\n (chunk) =>\n chunk.lod === lowestResLOD &&\n this.chunkViewStates_.get(chunk)?.visible === true &&\n chunk.state === \"loaded\"\n );\n\n return [...lowResChunks, ...currentLODChunks];\n }\n\n public updateChunkStates(\n sliceCoords: SliceCoordinates,\n viewport: Viewport\n ): void {\n const camera = viewport.camera;\n if (camera.type !== \"OrthographicCamera\") {\n throw new Error(\n \"ChunkStoreView currently supports only orthographic cameras. \" +\n \"Update the implementation before using a perspective camera.\"\n );\n }\n\n const orthoCamera = camera as OrthographicCamera;\n const viewBounds2D = orthoCamera.getWorldViewRect();\n const virtualWidth = Math.abs(viewBounds2D.max[0] - viewBounds2D.min[0]);\n const canvasElement = viewport.element as HTMLCanvasElement;\n const bufferWidth = viewport.getBoxRelativeTo(canvasElement).toRect().width;\n const virtualUnitsPerScreenPixel = virtualWidth / bufferWidth;\n const lodFactor = Math.log2(1 / virtualUnitsPerScreenPixel);\n\n this.setLOD(lodFactor);\n\n const zBounds = this.getZBounds(sliceCoords);\n const changed =\n this.policyChanged_ ||\n this.viewBounds2DChanged(viewBounds2D) ||\n this.zBoundsChanged(zBounds) ||\n this.lastTCoord_ !== sliceCoords.t;\n\n if (changed) {\n this.updateChunkViewStates(sliceCoords, viewBounds2D);\n\n this.policyChanged_ = false;\n this.lastViewBounds2D_ = viewBounds2D.clone();\n this.lastZBounds_ = zBounds;\n this.lastTCoord_ = sliceCoords.t;\n }\n }\n\n public allVisibleLowestLODLoaded(sliceCoords: SliceCoordinates): boolean {\n const timeIndex = this.store_.getTimeIndex(sliceCoords);\n const visibleChunks = this.store_\n .getChunksAtTime(timeIndex)\n .filter((c) => c.visible && c.lod === this.store_.getLowestResLOD());\n // Return false if there are no visible chunks (empty array .every() returns true)\n return (\n visibleChunks.length > 0 &&\n visibleChunks.every((c) => c.state === \"loaded\")\n );\n }\n\n public get currentLOD(): number {\n return this.currentLOD_;\n }\n\n public maybeForgetChunk(chunk: Chunk): void {\n const viewState = this.chunkViewStates_.get(chunk);\n if (\n viewState &&\n (viewState.visible || viewState.prefetch || viewState.priority !== null)\n ) {\n return;\n }\n this.chunkViewStates_.delete(chunk);\n }\n\n public setImageSourcePolicy(newPolicy: ImageSourcePolicy, key: symbol) {\n if (key !== INTERNAL_POLICY_KEY) {\n throw new Error(\"Unauthorized policy mutation\");\n }\n\n if (this.policy_ !== newPolicy) {\n this.policy_ = newPolicy;\n this.policyChanged_ = true;\n\n Logger.info(\n \"ChunkStoreView\",\n \"Using image source policy:\",\n this.policy_.profile\n );\n }\n }\n\n private setLOD(lodFactor: number): void {\n // `scale0` is the x pixel size (world units) at LOD 0.\n // With 2x downsampling per LOD, selection happens in log2 space.\n const dimensions = this.store_.dimensions;\n const scale0 = dimensions.x.lods[0].scale;\n const bias = this.policy_.lod.bias;\n\n // How many LOD 0 pixels per screen pixel, normalized by source scale and bias.\n const sourceAdjusted = bias - Math.log2(scale0) - lodFactor;\n const desiredLOD = Math.floor(sourceAdjusted);\n\n const lowestResLOD = this.store_.getLowestResLOD();\n // Intersect dataset bounds with policy bounds.\n const minPolicyLOD = Math.max(\n 0,\n Math.min(lowestResLOD, this.policy_.lod.min)\n );\n const maxPolicyLOD = Math.max(\n minPolicyLOD,\n Math.min(lowestResLOD, this.policy_.lod.max)\n );\n\n const target = clamp(desiredLOD, minPolicyLOD, maxPolicyLOD);\n if (target !== this.currentLOD_) {\n this.currentLOD_ = target;\n }\n }\n\n private updateChunkViewStates(\n sliceCoords: SliceCoordinates,\n viewBounds2D: Box2\n ): void {\n const currentTimeIndex = this.store_.getTimeIndex(sliceCoords);\n const currentTimeChunks = this.store_.getChunksAtTime(currentTimeIndex);\n\n if (currentTimeChunks.length === 0) {\n Logger.warn(\n \"ChunkStoreView\",\n \"updateChunkViewStates called with no chunks initialized\"\n );\n this.chunkViewStates_.clear();\n return;\n }\n\n const viewBoundsCenter2D = vec2.create();\n vec2.lerp(viewBoundsCenter2D, viewBounds2D.min, viewBounds2D.max, 0.5);\n\n const [zMin, zMax] = this.getZBounds(sliceCoords);\n const viewBounds3D = new Box3(\n vec3.fromValues(viewBounds2D.min[0], viewBounds2D.min[1], zMin),\n vec3.fromValues(viewBounds2D.max[0], viewBounds2D.max[1], zMax)\n );\n\n // reset all existing chunk view states to \"not needed\" to start\n // logic below will override this for chunks that are actually visible/prefetch\n this.chunkViewStates_.forEach(markUnused);\n\n this.updateChunksAtTimeIndex(\n currentTimeIndex,\n sliceCoords,\n viewBounds3D,\n viewBoundsCenter2D\n );\n\n if (sliceCoords.t !== undefined) {\n this.markTimeChunksForPrefetch(\n currentTimeIndex,\n viewBounds3D,\n viewBoundsCenter2D\n );\n }\n }\n\n private isChunkChannelInSlice(\n chunk: Chunk,\n sliceCoords: SliceCoordinates\n ): boolean {\n return sliceCoords.c === undefined || sliceCoords.c === chunk.chunkIndex.c;\n }\n\n private updateChunksAtTimeIndex(\n timeIndex: number,\n sliceCoords: SliceCoordinates,\n viewBounds3D: Box3,\n viewBounds2DCenter: ReadonlyVec2\n ): void {\n const paddedBounds = this.getPaddedBounds(viewBounds3D);\n\n const currentTimeChunks = this.store_.getChunksAtTime(timeIndex);\n\n for (const chunk of currentTimeChunks) {\n const isInBounds = this.isChunkWithinBounds(chunk, viewBounds3D);\n const isChannelInSlice = this.isChunkChannelInSlice(chunk, sliceCoords);\n\n const isCurrentLOD = chunk.lod === this.currentLOD_;\n const isFallbackLOD = chunk.lod === this.store_.getLowestResLOD();\n\n const prefetch =\n !isInBounds &&\n isChannelInSlice &&\n isCurrentLOD &&\n this.isChunkWithinBounds(chunk, paddedBounds);\n\n const visible = isInBounds && isChannelInSlice;\n const priority = this.computePriority(\n isFallbackLOD,\n isCurrentLOD,\n isInBounds,\n prefetch,\n isChannelInSlice\n );\n\n if (priority !== null) {\n const orderKey = this.squareDistance2D(chunk, viewBounds2DCenter);\n\n this.chunkViewStates_.set(chunk, {\n visible,\n prefetch,\n priority,\n orderKey,\n });\n }\n }\n }\n\n private markTimeChunksForPrefetch(\n currentTimeIndex: number,\n viewBounds3D: Box3,\n viewBoundsCenter2D: ReadonlyVec2\n ): void {\n const numTimePoints = this.store_.dimensions.t?.lods[0].size ?? 1;\n const tEnd = Math.min(\n numTimePoints - 1,\n currentTimeIndex + this.policy_.prefetch.t\n );\n for (let t = currentTimeIndex + 1; t <= tEnd; ++t) {\n for (const chunk of this.store_.getChunksAtTime(t)) {\n if (chunk.lod !== this.store_.getLowestResLOD()) continue;\n if (!this.isChunkWithinBounds(chunk, viewBounds3D)) continue;\n\n const priority = this.policy_.priorityMap[\"prefetchTime\"];\n const squareDistance = this.squareDistance2D(chunk, viewBoundsCenter2D);\n const normalizedDistance = clamp(\n squareDistance / this.sourceMaxSquareDistance2D_,\n 0,\n 1 - Number.EPSILON\n );\n const orderKey = t - currentTimeIndex + normalizedDistance;\n\n // Always set priority/orderKey to keep loaded chunks alive\n // Only unloaded chunks will be queued for loading\n this.chunkViewStates_.set(chunk, {\n visible: false,\n prefetch: true,\n priority,\n orderKey,\n });\n }\n }\n }\n\n private computePriority(\n isFallbackLOD: boolean,\n isCurrentLOD: boolean,\n isVisible: boolean,\n isPrefetch: boolean,\n isChannelInSlice: boolean\n ) {\n if (!isChannelInSlice) return null;\n\n const m = this.policy_.priorityMap;\n if (isFallbackLOD && isVisible) return m[\"fallbackVisible\"];\n if (isCurrentLOD && isVisible) return m[\"visibleCurrent\"];\n if (isFallbackLOD) return m[\"fallbackBackground\"];\n if (isCurrentLOD && isPrefetch) return m[\"prefetchSpace\"];\n\n return null;\n }\n\n private isChunkWithinBounds(chunk: Chunk, bounds: Box3): boolean {\n const chunkBounds = new Box3(\n vec3.fromValues(chunk.offset.x, chunk.offset.y, chunk.offset.z),\n vec3.fromValues(\n chunk.offset.x + chunk.shape.x * chunk.scale.x,\n chunk.offset.y + chunk.shape.y * chunk.scale.y,\n chunk.offset.z + chunk.shape.z * chunk.scale.z\n )\n );\n return Box3.intersects(chunkBounds, bounds);\n }\n\n private getZBounds(sliceCoords: SliceCoordinates): [number, number] {\n const zDim = this.store_.dimensions.z;\n if (zDim === undefined || sliceCoords.z === undefined) return [0, 1];\n\n const zLod = zDim.lods[this.currentLOD_];\n const zShape = zLod.size;\n const zScale = zLod.scale;\n const zTran = zLod.translation;\n const zPoint = Math.floor((sliceCoords.z - zTran) / zScale);\n const chunkDepth = zLod.chunkSize;\n\n const zChunk = Math.max(\n 0,\n Math.min(\n Math.floor(zPoint / chunkDepth),\n Math.ceil(zShape / chunkDepth) - 1\n )\n );\n\n return [\n zTran + zChunk * chunkDepth * zScale,\n zTran + (zChunk + 1) * chunkDepth * zScale,\n ];\n }\n\n private viewBounds2DChanged(newBounds: Box2): boolean {\n return (\n this.lastViewBounds2D_ === null ||\n !vec2.equals(this.lastViewBounds2D_.min, newBounds.min) ||\n !vec2.equals(this.lastViewBounds2D_.max, newBounds.max)\n );\n }\n\n private zBoundsChanged(newBounds: [number, number]): boolean {\n return !this.lastZBounds_ || !vec2.equals(this.lastZBounds_, newBounds);\n }\n\n private getPaddedBounds(bounds: Box3): Box3 {\n const dimensions = this.store_.dimensions;\n const xLod = dimensions.x.lods[this.currentLOD_];\n const yLod = dimensions.y.lods[this.currentLOD_];\n const zLod = dimensions.z?.lods[this.currentLOD_];\n\n const padX = xLod.chunkSize * xLod.scale * this.policy_.prefetch.x;\n const padY = yLod.chunkSize * yLod.scale * this.policy_.prefetch.y;\n\n let padZ = 0;\n if (zLod) {\n padZ = zLod.chunkSize * zLod.scale * this.policy_.prefetch.z;\n }\n\n return new Box3(\n vec3.fromValues(\n bounds.min[0] - padX,\n bounds.min[1] - padY,\n bounds.min[2] - padZ\n ),\n vec3.fromValues(\n bounds.max[0] + padX,\n bounds.max[1] + padY,\n bounds.max[2] + padZ\n )\n );\n }\n\n private squareDistance2D(chunk: Chunk, center: ReadonlyVec2): number {\n const chunkCenter = {\n x: chunk.offset.x + 0.5 * chunk.shape.x * chunk.scale.x,\n y: chunk.offset.y + 0.5 * chunk.shape.y * chunk.scale.y,\n };\n const dx = chunkCenter.x - center[0];\n const dy = chunkCenter.y - center[1];\n return dx * dx + dy * dy;\n }\n}\n\nfunction markUnused(state: ChunkViewState): void {\n state.visible = false;\n state.prefetch = false;\n state.priority = null;\n state.orderKey = null;\n}\n","import { Logger } from \"../utilities/logger\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { ChunkQueue } from \"../data/chunk_queue\";\nimport { ChunkStore } from \"./chunk_store\";\nimport { ChunkStoreView } from \"./chunk_store_view\";\nimport { ImageSourcePolicy } from \"./image_source_policy\";\n\nexport class ChunkManager {\n private readonly stores_ = new Map<ChunkSource, ChunkStore>();\n private readonly pendingStores_ = new Map<ChunkSource, Promise<ChunkStore>>();\n private readonly views_ = new Map<ChunkStore, ChunkStoreView[]>();\n private readonly queue_ = new ChunkQueue();\n\n public async addView(\n source: ChunkSource,\n policy: ImageSourcePolicy\n ): Promise<ChunkStoreView> {\n const store = await this.addSource(source);\n const view = new ChunkStoreView(store, policy);\n this.views_.set(store, (this.views_.get(store) ?? []).concat(view));\n return view;\n }\n\n public removeView(view: ChunkStoreView): void {\n const store = view.store;\n const source = this.getSourceForStore(store);\n\n const views = this.views_.get(store);\n if (!views) {\n throw new Error(\"Cannot remove view: store not managed by ChunkManager\");\n }\n\n const index = views.indexOf(view);\n if (index === -1) {\n throw new Error(\n `Cannot remove view: view not found in store's view list (source: ${source})`\n );\n }\n\n const affectedChunks = Array.from(view.chunkViewStates.keys());\n views.splice(index, 1);\n\n for (const chunk of affectedChunks) {\n this.aggregateChunkViewStates(chunk, store);\n }\n\n if (views.length === 0) {\n this.stores_.delete(source);\n this.views_.delete(store);\n }\n }\n\n private async addSource(source: ChunkSource): Promise<ChunkStore> {\n const existingOrPending =\n this.stores_.get(source) ?? this.pendingStores_.get(source);\n if (existingOrPending) {\n return existingOrPending;\n }\n\n const initializeStore = async () => {\n const loader = await source.open();\n const store = new ChunkStore(loader);\n this.stores_.set(source, store);\n this.pendingStores_.delete(source);\n return store;\n };\n\n const pending = initializeStore();\n this.pendingStores_.set(source, pending);\n return pending;\n }\n\n private getSourceForStore(store: ChunkStore): ChunkSource {\n for (const [source, s] of this.stores_) {\n if (s === store) {\n return source;\n }\n }\n throw new Error(\"Source not found for the given store.\");\n }\n\n public update() {\n for (const [_, store] of this.stores_) {\n const updatedChunks = this.updateAndCollectChunkChanges(store);\n\n for (const chunk of updatedChunks) {\n if (chunk.priority === null) {\n this.queue_.cancel(chunk);\n } else if (chunk.state === \"queued\") {\n this.queue_.enqueue(chunk, (signal) =>\n store.loadChunkData(chunk, signal)\n );\n }\n }\n }\n\n this.queue_.flush();\n }\n\n private updateAndCollectChunkChanges(store: ChunkStore): Set<Chunk> {\n const views = this.views_.get(store);\n if (!views) return new Set<Chunk>();\n const affectedChunks = new Set<Chunk>();\n for (const view of views) {\n for (const [chunk, _viewState] of view.chunkViewStates) {\n affectedChunks.add(chunk);\n }\n }\n\n for (const chunk of affectedChunks) {\n this.aggregateChunkViewStates(chunk, store);\n }\n\n return affectedChunks;\n }\n\n private aggregateChunkViewStates(chunk: Chunk, store: ChunkStore): void {\n const views = this.views_.get(store);\n if (!views) return;\n let anyVisible = false;\n let anyPrefetch = false;\n let minPriority: number | null = null;\n let orderKeyForMinPriority: number | null = null;\n\n for (const view of views) {\n const viewState = view.chunkViewStates.get(chunk);\n if (!viewState) continue;\n\n if (viewState.visible) anyVisible = true;\n if (viewState.prefetch) anyPrefetch = true;\n\n if (viewState.priority !== null) {\n if (minPriority === null || viewState.priority < minPriority) {\n minPriority = viewState.priority;\n orderKeyForMinPriority = viewState.orderKey;\n }\n }\n\n if (\n !viewState.visible &&\n !viewState.prefetch &&\n viewState.priority === null\n ) {\n view.maybeForgetChunk(chunk);\n }\n }\n\n chunk.visible = anyVisible;\n chunk.prefetch = anyPrefetch;\n chunk.priority = minPriority;\n chunk.orderKey = orderKeyForMinPriority;\n\n const shouldEnqueueChunk =\n chunk.priority !== null && chunk.state === \"unloaded\";\n if (shouldEnqueueChunk) {\n chunk.state = \"queued\";\n return;\n }\n\n const shouldCancelQueuedChunk =\n chunk.priority === null && chunk.state === \"queued\";\n if (shouldCancelQueuedChunk) {\n chunk.state = \"unloaded\";\n return;\n }\n\n const shouldDisposeChunk =\n chunk.state === \"loaded\" && !chunk.visible && !chunk.prefetch;\n if (shouldDisposeChunk) {\n chunk.data = undefined;\n chunk.state = \"unloaded\";\n chunk.priority = null;\n chunk.orderKey = null;\n chunk.prefetch = false;\n Logger.debug(\n \"ChunkManager\",\n `Disposing chunk ${JSON.stringify(chunk.chunkIndex)} in LOD ${chunk.lod}`\n );\n }\n }\n}\n","/**\n * @author mrdoob / http://mrdoob.com/\n *\n * Modified to add resizing support via the `scale` parameter.\n */\n\nvar Stats = function(scale = 1) {\n\n var mode = 0;\n\n var container = document.createElement('div');\n container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n container.addEventListener('click', function(event) {\n\n event.preventDefault();\n showPanel(++mode % container.children.length);\n\n }, false);\n\n //\n\n function addPanel(panel) {\n\n container.appendChild(panel.dom);\n return panel;\n\n }\n\n function showPanel(id) {\n\n for (var i = 0; i < container.children.length; i++) {\n\n container.children[i].style.display = i === id ? 'block' : 'none';\n\n }\n\n mode = id;\n\n }\n\n //\n\n var beginTime = (performance || Date).now(), prevTime = beginTime, frames = 0;\n\n var fpsPanel = addPanel(new Stats.Panel('FPS', '#0ff', '#002', scale));\n var msPanel = addPanel(new Stats.Panel('MS', '#0f0', '#020', scale));\n\n if (self.performance && self.performance.memory) {\n\n var memPanel = addPanel(new Stats.Panel('MB', '#f08', '#201', scale));\n\n }\n\n showPanel(0);\n\n return {\n\n REVISION: 16,\n\n dom: container,\n\n addPanel: addPanel,\n showPanel: showPanel,\n\n begin: function() {\n\n beginTime = (performance || Date).now();\n\n },\n\n end: function() {\n\n frames++;\n\n var time = (performance || Date).now();\n\n msPanel.update(time - beginTime, 200);\n\n if (time >= prevTime + 1000) {\n\n fpsPanel.update((frames * 1000) / (time - prevTime), 100);\n\n prevTime = time;\n frames = 0;\n\n if (memPanel) {\n\n var memory = performance.memory;\n memPanel.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576);\n\n }\n\n }\n\n return time;\n\n },\n\n update: function() {\n\n beginTime = this.end();\n\n },\n\n // Backwards Compatibility\n\n domElement: container,\n setMode: showPanel\n\n };\n\n};\n\nStats.Panel = function(name, fg, bg, scale) {\n\n var min = Infinity, max = 0, round = Math.round;\n var PR = round(window.devicePixelRatio || 1);\n\n var WIDTH = round(80 * PR * scale);\n var HEIGHT = round(48 * PR * scale);\n var TEXT_X = round(3 * PR * scale);\n var TEXT_Y = round(2 * PR * scale);\n var GRAPH_X = round(3 * PR * scale);\n var GRAPH_Y = round(15 * PR * scale);\n var GRAPH_WIDTH = round(74 * PR * scale);\n var GRAPH_HEIGHT = round(30 * PR * scale);\n\n var canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n canvas.style.cssText = `width:${round(scale * 80)}px;height:${round(scale * 48)}px`;\n\n var context = canvas.getContext('2d');\n context.font = 'bold ' + round(9 * PR * scale) + 'px Helvetica,Arial,sans-serif';\n context.textBaseline = 'top';\n\n context.fillStyle = bg;\n context.fillRect(0, 0, WIDTH, HEIGHT);\n\n context.fillStyle = fg;\n context.fillText(name, TEXT_X, TEXT_Y);\n context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n context.fillStyle = bg;\n context.globalAlpha = 0.9;\n context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n return {\n\n dom: canvas,\n\n update: function(value, maxValue) {\n\n min = Math.min(min, value);\n max = Math.max(max, value);\n\n context.fillStyle = bg;\n context.globalAlpha = 1;\n context.fillRect(0, 0, WIDTH, GRAPH_Y);\n context.fillStyle = fg;\n context.fillText(round(value) + ' ' + name + ' (' + round(min) + '-' + round(max) + ')', TEXT_X, TEXT_Y);\n\n context.drawImage(canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT);\n\n context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT);\n\n context.fillStyle = bg;\n context.globalAlpha = 0.9;\n context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round((1 - (value / maxValue)) * GRAPH_HEIGHT));\n\n }\n\n };\n\n};\n\nexport { Stats as default };\n","import Stats, { type Stats as StatsType } from \"./vendored/stats.js\";\n\nexport function createStats({ scale } = { scale: 1.5 }): StatsType {\n const stats = new Stats(scale);\n stats.showPanel(0 /* 0 = fps, 1 = ms, 2 = mb */);\n document.body.appendChild(stats.dom);\n return stats;\n}\n\n// Re-export types from the vendored module\nexport type { Stats, StatsPanel } from \"./vendored/stats.js\";\n","import { Layer } from \"./layer\";\nimport { IdetikContext } from \"../idetik\";\n\nexport class LayerManager {\n private layers_: ReadonlyArray<Layer> = [];\n private callbacks_: Array<() => void> = [];\n\n private readonly context_: IdetikContext;\n\n constructor(context: IdetikContext) {\n this.context_ = context;\n }\n\n public partitionLayers(): {\n opaque: Layer[];\n transparent: Layer[];\n } {\n const opaque: Layer[] = [];\n const transparent: Layer[] = [];\n\n for (const layer of this.layers) {\n if (layer.transparent) {\n transparent.push(layer);\n } else {\n opaque.push(layer);\n }\n }\n\n return { opaque, transparent };\n }\n\n public add(layer: Layer) {\n this.layers_ = [...this.layers_, layer];\n layer.onAttached(this.context_);\n this.notifyLayersChanged();\n }\n\n public remove(layer: Layer) {\n const index = this.layers_.indexOf(layer);\n if (index === -1) {\n throw new Error(`Layer to remove not found: ${layer}`);\n }\n this.removeByIndex(index);\n }\n\n public removeByIndex(index: number) {\n const layer = this.layers_[index];\n if (layer) {\n layer.onDetached(this.context_);\n }\n this.layers_ = this.layers_.filter((_, i) => i !== index);\n this.notifyLayersChanged();\n }\n\n public removeAll() {\n for (const layer of this.layers_) {\n layer.onDetached(this.context_);\n }\n this.layers_ = [];\n this.notifyLayersChanged();\n }\n\n public get layers(): readonly Layer[] {\n return this.layers_;\n }\n\n private notifyLayersChanged(): void {\n for (const callback of this.callbacks_) {\n callback();\n }\n }\n\n public addLayersChangeCallback(callback: () => void): () => void {\n this.callbacks_.push(callback);\n return () => {\n this.removeLayersChangeCallback(callback);\n };\n }\n\n public removeLayersChangeCallback(callback: () => void): void {\n const index = this.callbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove not found: ${callback}`);\n }\n this.callbacks_.splice(index, 1);\n }\n}\n","import { vec3 } from \"gl-matrix\";\nimport { Logger } from \"../utilities/logger\";\n\nconst eventTypes = [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointercancel\",\n \"wheel\",\n] as const;\n\ntype EventType = (typeof eventTypes)[number];\nfunction isEventType(type: string): type is EventType {\n return (eventTypes as readonly string[]).includes(type);\n}\n\nexport class EventContext {\n private propagationStopped_: boolean = false;\n public readonly type: EventType;\n public readonly event?: Event;\n public worldPos?: vec3;\n public clipPos?: vec3;\n\n constructor(type: EventType, event?: Event) {\n this.type = type;\n this.event = event;\n }\n\n get propagationStopped() {\n return this.propagationStopped_;\n }\n\n stopPropagation() {\n this.propagationStopped_ = true;\n }\n}\n\ntype Listener = (event: EventContext) => void;\n\nexport class EventDispatcher {\n private readonly listeners_: Listener[] = [];\n private readonly element_: HTMLElement;\n private isConnected_ = false;\n\n constructor(element: HTMLElement) {\n this.element_ = element;\n }\n\n public addEventListener(listener: Listener) {\n this.listeners_.push(listener);\n }\n\n public connect() {\n if (this.isConnected_) {\n Logger.warn(\n \"EventDispatcher\",\n \"Attempted to connect already connected event dispatcher\",\n `element id: ${this.element_.id}`\n );\n return;\n }\n this.isConnected_ = true;\n eventTypes.forEach((type) => {\n this.element_.addEventListener(type, this.handleEvent, {\n passive: false,\n });\n });\n }\n\n public disconnect() {\n if (!this.isConnected_) {\n Logger.debug(\n \"EventDispatcher\",\n \"Attempted to disconnect already disconnected event dispatcher\",\n `element id: ${this.element_.id}`\n );\n return;\n }\n this.isConnected_ = false;\n eventTypes.forEach((type) => {\n this.element_.removeEventListener(type, this.handleEvent);\n });\n }\n\n private readonly handleEvent = (e: Event) => {\n if (!isEventType(e.type)) {\n Logger.error(\"EventDispatcher\", `Unsupported event type ${e.type}`);\n return;\n }\n\n const event = new EventContext(e.type, e);\n for (const listener of this.listeners_) {\n listener(event);\n if (event.propagationStopped) break;\n }\n };\n}\n","import { Camera } from \"../objects/cameras/camera\";\nimport { Layer } from \"./layer\";\nimport { LayerManager } from \"./layer_manager\";\nimport { CameraControls } from \"../objects/cameras/controls\";\nimport { Box2 } from \"../math/box2\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { generateUUID } from \"../utilities/uuid_generator\";\nimport { Logger } from \"../utilities/logger\";\nimport { EventContext, EventDispatcher } from \"./event_dispatcher\";\nimport { IdetikContext } from \"../idetik\";\n\nexport interface ViewportConfig {\n id?: string;\n element?: HTMLElement;\n camera: Camera;\n layers?: Layer[];\n cameraControls?: CameraControls;\n}\n\ninterface ViewportProps extends ViewportConfig {\n id: string;\n element: HTMLElement;\n layerManager: LayerManager;\n}\n\nexport class Viewport {\n public readonly id: string;\n public readonly element: HTMLElement;\n public readonly camera: Camera;\n public readonly layerManager: LayerManager;\n public readonly events: EventDispatcher;\n public cameraControls?: CameraControls;\n\n constructor(props: ViewportProps) {\n this.id = props.id;\n this.element = props.element;\n this.camera = props.camera;\n this.layerManager = props.layerManager;\n this.cameraControls = props.cameraControls;\n this.updateAspectRatio();\n this.events = new EventDispatcher(this.element);\n this.events.addEventListener((event: EventContext) => {\n if (\n event.event instanceof PointerEvent ||\n event.event instanceof WheelEvent\n ) {\n const { clientX, clientY } = event.event;\n const client = vec2.fromValues(clientX, clientY);\n event.clipPos = this.clientToClip(client, 0);\n event.worldPos = this.camera.clipToWorld(event.clipPos);\n }\n for (const layer of this.layerManager.layers) {\n layer.onEvent(event);\n if (event.propagationStopped) return;\n }\n this.cameraControls?.onEvent(event);\n });\n\n for (const layer of props.layers ?? []) {\n this.layerManager.add(layer);\n }\n }\n\n public updateSize(): void {\n this.updateAspectRatio();\n }\n\n public getBoxRelativeTo(canvas: HTMLCanvasElement): Box2 {\n const viewportRect = this.getBox().toRect();\n const canvasRect = canvas.getBoundingClientRect();\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // convert canvas rect to device pixels\n // viewport rect is already in device pixels\n const canvasX = canvasRect.left * devicePixelRatio;\n const canvasY = canvasRect.top * devicePixelRatio;\n const canvasHeight = canvasRect.height * devicePixelRatio;\n\n const relativeX = viewportRect.x - canvasX;\n const relativeY = viewportRect.y - canvasY;\n\n // Note: WebGL Y coordinate is flipped, so we adjust the Y position\n const x = Math.floor(relativeX);\n const y = Math.floor(canvasHeight - relativeY - viewportRect.height);\n const width = Math.floor(viewportRect.width);\n const height = Math.floor(viewportRect.height);\n\n return new Box2(\n vec2.fromValues(x, y),\n vec2.fromValues(x + width, y + height)\n );\n }\n\n public clientToClip(position: vec2, depth: number = 0): vec3 {\n const [x, y] = position;\n const rect = this.element.getBoundingClientRect();\n return vec3.fromValues(\n (2 * (x - rect.x)) / rect.width - 1,\n (2 * (y - rect.y)) / rect.height - 1,\n depth\n );\n }\n\n public clientToWorld(position: vec2, depth: number = 0): vec3 {\n const clipPos = this.clientToClip(position, depth);\n return this.camera.clipToWorld(clipPos);\n }\n\n private getBox(): Box2 {\n const viewportRect = this.element.getBoundingClientRect();\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n const x = viewportRect.left * devicePixelRatio;\n const y = viewportRect.top * devicePixelRatio;\n const width = viewportRect.width * devicePixelRatio;\n const height = viewportRect.height * devicePixelRatio;\n\n return new Box2(\n vec2.fromValues(x, y),\n vec2.fromValues(x + width, y + height)\n );\n }\n\n private updateAspectRatio(): void {\n const { width, height } = this.getBox().toRect();\n if (width <= 0 || height <= 0) {\n Logger.debug(\n \"Viewport\",\n `Skipping aspect ratio update for viewport ${this.id}: invalid dimensions ${width}x${height}`\n );\n return;\n }\n const aspectRatio = width / height;\n this.camera.setAspectRatio(aspectRatio);\n }\n}\n\nfunction validateViewportProps(viewportProps: ViewportProps[]): void {\n const elementToViewportId = new Map<HTMLElement, string>();\n const seenViewportIds = new Set<string>();\n\n for (const props of viewportProps) {\n if (seenViewportIds.has(props.id)) {\n throw new Error(\n `Duplicate viewport ID \"${props.id}\". Each viewport must have a unique ID.`\n );\n }\n seenViewportIds.add(props.id);\n\n if (elementToViewportId.has(props.element)) {\n const existingViewportId = elementToViewportId.get(props.element)!;\n const elementDescription =\n props.element.tagName.toLowerCase() +\n (props.element.id ? `#${props.element.id}` : \"[element has no id]\");\n throw new Error(\n \"Multiple viewports cannot share the same HTML element: \" +\n `viewports \"${existingViewportId}\" and \"${props.id}\" both use ${elementDescription}`\n );\n }\n elementToViewportId.set(props.element, props.id);\n }\n}\n\nexport function parseViewportConfigs(\n viewportConfigs: ViewportConfig[],\n canvas: HTMLCanvasElement,\n context: IdetikContext\n): Viewport[] {\n const viewportProps: ViewportProps[] = viewportConfigs.map((config) => {\n const element = config.element ?? canvas;\n return {\n ...config,\n element,\n id: config.id ?? element.id ?? generateUUID(),\n layerManager: new LayerManager(context),\n };\n });\n validateViewportProps(viewportProps);\n return viewportProps.map((props) => new Viewport(props));\n}\n","import { Logger } from \"./logger\";\n\n// Observes changes to the pixel size of HTML elements, including changes due to\n// window/device pixel ratio changes.\nexport class PixelSizeObserver {\n private elements_: ReadonlyArray<HTMLElement>;\n private resizeObserver_?: ResizeObserver;\n private mediaQuery_?: MediaQueryList;\n private onMediaQueryChange_?: () => void;\n private changed_ = false;\n\n constructor(elements: ReadonlyArray<HTMLElement> = []) {\n this.elements_ = elements;\n }\n\n public connect() {\n if (this.resizeObserver_) {\n Logger.warn(\n \"PixelSizeObserver\",\n \"Attempted to connect already connected observer\"\n );\n return;\n }\n this.resizeObserver_ = new ResizeObserver(() => {\n this.changed_ = true;\n });\n\n for (const element of this.elements_) {\n this.resizeObserver_.observe(element);\n }\n\n this.startDevicePixelRatioObserver();\n }\n\n public getAndResetChanged() {\n const wasChanged = this.changed_;\n this.changed_ = false;\n return wasChanged;\n }\n\n private startDevicePixelRatioObserver() {\n // this media query needs to be updated after a change is detected, so we use a one-time\n // event listener that re-registers itself with the new value\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#monitoring_screen_resolution_or_zoom_level_changes\n this.mediaQuery_ = matchMedia(\n `(resolution: ${window.devicePixelRatio}dppx)`\n );\n this.onMediaQueryChange_ = () => {\n this.changed_ = true;\n this.startDevicePixelRatioObserver();\n };\n this.mediaQuery_.addEventListener(\"change\", this.onMediaQueryChange_, {\n once: true,\n });\n }\n\n public disconnect() {\n if (!this.resizeObserver_) {\n Logger.warn(\n \"PixelSizeObserver\",\n \"Attempted to disconnect already disconnected observer\"\n );\n return;\n }\n this.resizeObserver_?.disconnect();\n if (this.mediaQuery_ && this.onMediaQueryChange_) {\n this.mediaQuery_.removeEventListener(\"change\", this.onMediaQueryChange_);\n }\n }\n}\n","import { WebGLRenderer } from \"./renderers/webgl_renderer\";\nimport { Logger } from \"./utilities/logger\";\nimport { ChunkManager } from \"./core/chunk_manager\";\nimport { createStats, type Stats } from \"./utilities/stats\";\nimport {\n parseViewportConfigs,\n Viewport,\n ViewportConfig,\n} from \"./core/viewport\";\nimport { PixelSizeObserver } from \"./utilities/pixel_size_observer\";\n\ntype Overlay = {\n update(idetik: Idetik, timestamp?: DOMHighResTimeStamp): void;\n};\n\ntype IdetikParams = {\n canvas: HTMLCanvasElement;\n viewports: [ViewportConfig, ...ViewportConfig[]]; // at least one viewport required\n overlays?: Overlay[];\n showStats?: boolean;\n};\n\nexport type IdetikContext = {\n chunkManager: ChunkManager;\n};\n\nexport class Idetik {\n private lastAnimationId_?: number;\n private readonly chunkManager_: ChunkManager;\n private readonly context_: IdetikContext;\n private readonly renderer_: WebGLRenderer;\n private readonly viewports_: Viewport[];\n public readonly canvas: HTMLCanvasElement;\n public readonly overlays: Overlay[];\n private readonly stats_?: Stats;\n private readonly sizeObserver_: PixelSizeObserver;\n\n /**\n * Creates a new Idetik visualization runtime instance.\n *\n * @param params - Configuration parameters for the Idetik instance\n * @param params.canvas - HTMLCanvasElement to render to\n * @param params.viewports - Array of viewport configurations. (At least one required.)\n * Each viewport renders with its own camera, layers, and controls.\n * The `element` property is optional and defaults to the canvas if not provided.\n * Elements must be unique across viewports.\n * The `id` property is optional but useful for referencing specific viewports later.\n * @param params.overlays - Optional array of overlay objects that update each frame (e.g., for HUD elements)\n * @param params.showStats - Optional flag to display performance statistics\n *\n * @example\n * // Single viewport (element defaults to canvas)\n * const camera = new OrthographicCamera(0, 1024, 0, 1024);\n * const idetik = new Idetik({\n * canvas: document.querySelector('canvas')!,\n * viewports: [{\n * camera: camera,\n * layers: [imageLayer],\n * cameraControls: new PanZoomControls(camera)\n * }]\n * });\n *\n * @example\n * // Multiple viewports - one defaults to canvas, others use separate elements\n * const idetik = new Idetik({\n * canvas: document.querySelector('canvas')!,\n * viewports: [\n * {\n * id: 'main',\n * // element omitted - defaults to canvas\n * camera: camera1,\n * layers: [layer1]\n * },\n * {\n * id: 'minimap',\n * element: document.querySelector('#minimap')!,\n * camera: camera2,\n * layers: [layer2]\n * }\n * ]\n * });\n *\n * @throws {Error} If viewports array is empty or not provided\n * @throws {Error} If viewports have duplicate IDs or shared elements\n */\n constructor(params: IdetikParams) {\n this.canvas = params.canvas;\n\n if (params.viewports.length === 0) {\n throw new Error(\"At least one viewport config must be specified.\");\n }\n\n this.renderer_ = new WebGLRenderer(this.canvas);\n this.chunkManager_ = new ChunkManager();\n this.context_ = {\n chunkManager: this.chunkManager_,\n };\n\n this.viewports_ = parseViewportConfigs(\n params.viewports,\n this.canvas,\n this.context_\n );\n\n this.overlays = params.overlays ?? [];\n\n if (params.showStats) this.stats_ = createStats();\n\n const sizeDependents: HTMLElement[] = [this.canvas];\n for (const viewport of this.viewports_) {\n if (viewport.element !== this.canvas) {\n sizeDependents.push(viewport.element);\n }\n }\n this.sizeObserver_ = new PixelSizeObserver(sizeDependents);\n }\n\n public get renderedObjects() {\n return this.renderer_.renderedObjects;\n }\n\n public get width() {\n return this.renderer_.width;\n }\n\n public get height() {\n return this.renderer_.height;\n }\n\n public get textureInfo() {\n return this.renderer_.textureInfo;\n }\n\n public get viewports(): readonly Viewport[] {\n return this.viewports_;\n }\n\n public getViewport(id: string): Viewport | undefined {\n return this.viewports_.find((v) => v.id === id);\n }\n\n public start() {\n Logger.info(\"Idetik\", \"Idetik runtime starting\");\n if (this.lastAnimationId_ === undefined) {\n for (const viewport of this.viewports_) {\n viewport.events.connect();\n }\n this.sizeObserver_.connect();\n this.animate();\n } else {\n Logger.warn(\"Idetik\", \"Idetik runtime already started\");\n }\n return this;\n }\n\n private animate(timestamp?: DOMHighResTimeStamp) {\n if (this.stats_) this.stats_.begin();\n\n // Must resize before render b/c changing canvas coordinate space clears it.\n if (this.sizeObserver_.getAndResetChanged()) {\n this.updateSize();\n }\n\n for (const viewport of this.viewports_) {\n this.renderer_.render(viewport);\n }\n\n this.chunkManager_.update();\n\n for (const overlay of this.overlays) {\n overlay.update(this, timestamp);\n }\n\n if (this.stats_) this.stats_.end();\n this.lastAnimationId_ = requestAnimationFrame((timestamp) =>\n this.animate(timestamp)\n );\n }\n\n public stop() {\n Logger.info(\"Idetik\", \"Idetik runtime stopping\");\n if (this.lastAnimationId_ === undefined) {\n Logger.warn(\"Idetik\", \"Idetik runtime not started\");\n } else {\n this.sizeObserver_.disconnect();\n for (const viewport of this.viewports_) {\n viewport.events.disconnect();\n }\n cancelAnimationFrame(this.lastAnimationId_);\n this.lastAnimationId_ = undefined;\n }\n }\n\n private updateSize() {\n this.renderer_.updateSize();\n for (const viewport of this.viewports_) {\n viewport.updateSize();\n }\n }\n}\n","import { Geometry } from \"./geometry\";\nimport { Logger } from \"../utilities/logger\";\n\nexport class WireframeGeometry extends Geometry {\n constructor(geometry: Geometry) {\n super();\n\n if (geometry.primitive != \"triangles\") {\n Logger.warn(\"WireframeGeometry\", \"Only indexed geometries are supported\");\n return;\n }\n\n if (geometry.indexData.length == 0) {\n Logger.warn(\n \"WireframeGeometry\",\n \"Only triangulated geometries are supported\"\n );\n return;\n }\n\n this.primitive_ = \"lines\";\n this.vertexData_ = geometry.vertexData;\n this.attributes_ = geometry.attributes;\n\n const edgeSet = new Set<{ i0: number; i1: number }>();\n const wireframeIndices: number[] = [];\n const addEdge = (a: number, b: number) => {\n // Normalize edge order and use a set to deduplicate,\n // since shared edges between triangles would otherwise\n // be added multiple times.\n const i0 = Math.min(a, b);\n const i1 = Math.max(a, b);\n if (!edgeSet.has({ i0, i1 })) {\n edgeSet.add({ i0, i1 });\n wireframeIndices.push(i0, i1);\n }\n };\n\n const index = geometry.indexData;\n for (let i = 0; i < index.length; i += 3) {\n const i0 = index[i];\n const i1 = index[i + 1];\n const i2 = index[i + 2];\n addEdge(i0, i1);\n addEdge(i1, i2);\n addEdge(i2, i0);\n }\n\n this.indexData_ = new Uint32Array(wireframeIndices);\n }\n}\n","import { mat4, mat3, vec3, quat, glMatrix } from \"gl-matrix\";\n\n// +Y is world up to match gl-matrix\nconst WORLD_UP = vec3.fromValues(0, 1, 0);\n\nexport class TrsTransform {\n private dirty_ = true;\n private matrix_ = mat4.create();\n private rotation_ = quat.create();\n private translation_ = vec3.create();\n private scale_ = vec3.fromValues(1, 1, 1);\n\n public addRotation(q: quat) {\n quat.multiply(this.rotation_, this.rotation_, q);\n this.dirty_ = true;\n }\n\n public setRotation(q: quat) {\n quat.copy(this.rotation_, q);\n this.dirty_ = true;\n }\n\n public get rotation() {\n return quat.clone(this.rotation_);\n }\n\n public addTranslation(vec: vec3) {\n vec3.add(this.translation_, this.translation_, vec);\n this.dirty_ = true;\n }\n\n public setTranslation(vec: vec3) {\n vec3.copy(this.translation_, vec);\n this.dirty_ = true;\n }\n\n public get translation() {\n return vec3.clone(this.translation_);\n }\n\n public addScale(vec: vec3) {\n vec3.multiply(this.scale_, this.scale_, vec);\n this.dirty_ = true;\n }\n\n public setScale(vec: vec3) {\n vec3.copy(this.scale_, vec);\n this.dirty_ = true;\n }\n\n public targetTo(target: vec3) {\n // Prevent zero-length forward vector by nudging\n // target slightly along +Z\n if (vec3.equals(this.translation_, target)) {\n target = vec3.clone(target);\n target[2] += glMatrix.EPSILON;\n }\n\n const m = mat4.targetTo(mat4.create(), this.translation_, target, WORLD_UP);\n const rotation = mat3.fromMat4(mat3.create(), m);\n quat.fromMat3(this.rotation_, rotation);\n quat.normalize(this.rotation_, this.rotation_);\n\n this.dirty_ = true;\n }\n\n public get scale() {\n return vec3.clone(this.scale_);\n }\n\n public get matrix() {\n if (this.dirty_) {\n this.computeMatrix();\n this.dirty_ = false;\n }\n return this.matrix_;\n }\n\n public get inverse() {\n return mat4.invert(mat4.create(), this.matrix);\n }\n\n private computeMatrix() {\n mat4.fromRotationTranslationScale(\n this.matrix_,\n this.rotation_,\n this.translation_,\n this.scale_\n );\n }\n}\n","import { Node } from \"../core/node\";\nimport { Geometry } from \"../core/geometry\";\nimport { WireframeGeometry } from \"../core/wireframe_geometry\";\nimport { Texture } from \"../objects/textures/texture\";\nimport { TrsTransform } from \"../core/transforms\";\nimport { Shader } from \"../renderers/shaders\";\nimport { Color } from \"../core/color\";\nimport { CullingMode } from \"../renderers/WebGLState\";\n\nexport abstract class RenderableObject extends Node {\n public wireframeEnabled = false;\n public wireframeColor = Color.WHITE;\n private readonly textures_: Texture[] = [];\n private staleTextures_: Texture[] = [];\n private readonly transform_ = new TrsTransform();\n private geometry_ = new Geometry();\n private wireframeGeometry_: WireframeGeometry | null = null;\n private programName_: Shader | null = null;\n private cullFaceMode_: CullingMode = \"none\";\n\n public setTexture(index: number, texture: Texture) {\n const oldTexture = this.textures_[index];\n if (oldTexture !== undefined) {\n this.staleTextures_.push(oldTexture);\n }\n this.textures_[index] = texture;\n }\n\n public popStaleTextures() {\n const stale = this.staleTextures_;\n this.staleTextures_ = [];\n return stale;\n }\n\n public get geometry() {\n return this.geometry_;\n }\n\n public get wireframeGeometry() {\n this.wireframeGeometry_ ??= new WireframeGeometry(this.geometry);\n return this.wireframeGeometry_;\n }\n\n public get textures() {\n return this.textures_;\n }\n\n public get transform() {\n return this.transform_;\n }\n\n public set geometry(geometry: Geometry) {\n this.geometry_ = geometry;\n this.wireframeGeometry_ = null;\n }\n\n public get programName(): Shader {\n if (this.programName_ === null) {\n throw new Error(\"Program name not set\");\n }\n return this.programName_;\n }\n\n public get boundingBox() {\n const box = this.geometry_.boundingBox.clone();\n box.applyTransform(this.transform_.matrix);\n return box;\n }\n\n protected set programName(programName: Shader) {\n this.programName_ = programName;\n }\n\n public get cullFaceMode() {\n return this.cullFaceMode_;\n }\n\n public set cullFaceMode(mode: CullingMode) {\n this.cullFaceMode_ = mode;\n }\n\n /**\n * Get uniforms for shader program. Override in derived classes that need custom uniforms.\n * @returns Object containing uniform name-value pairs\n */\n public getUniforms(): Record<string, unknown> {\n return {}; // Default implementation returns no uniforms\n }\n}\n","import { vec3 } from \"gl-matrix\";\n\nexport class Plane {\n public normal: vec3;\n public signedDistance: number;\n\n constructor(normal: vec3 = vec3.fromValues(0, 1, 0), distance = 0) {\n this.normal = vec3.clone(normal);\n this.signedDistance = distance;\n }\n\n public set(normal: vec3, distance: number) {\n this.normal = vec3.clone(normal);\n this.signedDistance = distance;\n }\n\n public signedDistanceToPoint(point: vec3) {\n // Algebraic convention ax + by + cz + d = 0\n // Negative values mean the point lies opposite the plane's normal\n return vec3.dot(this.normal, point) + this.signedDistance;\n }\n\n public normalize() {\n const len = vec3.length(this.normal);\n if (len > 0) {\n const inv = 1 / len;\n vec3.scale(this.normal, this.normal, inv);\n this.signedDistance *= inv;\n }\n }\n}\n","import { Plane } from \"./plane\";\nimport { Box3 } from \"./box3\";\nimport { mat4, vec3 } from \"gl-matrix\";\n\nexport class Frustum {\n private readonly planes_: [Plane, Plane, Plane, Plane, Plane, Plane];\n\n constructor(m: mat4) {\n this.planes_ = [\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n new Plane(vec3.create(), 0),\n ];\n this.setWithViewProjection(m);\n }\n\n // Uses the fast plane-extraction algorithm described in\n // Gribb & Hartmann (1997): https://tinyurl.com/5x5htcwm\n public setWithViewProjection(m: mat4) {\n const n = vec3.create();\n\n // Left: row3 + row0\n this.planes_[0].set(\n vec3.set(n, m[3] + m[0], m[7] + m[4], m[11] + m[8]),\n m[15] + m[12]\n );\n\n // Right: row3 - row0\n this.planes_[1].set(\n vec3.set(n, m[3] - m[0], m[7] - m[4], m[11] - m[8]),\n m[15] - m[12]\n );\n\n // Top: row3 - row1\n this.planes_[2].set(\n vec3.set(n, m[3] - m[1], m[7] - m[5], m[11] - m[9]),\n m[15] - m[13]\n );\n\n // Bottom: row3 + row1\n this.planes_[3].set(\n vec3.set(n, m[3] + m[1], m[7] + m[5], m[11] + m[9]),\n m[15] + m[13]\n );\n\n // Near: row3 + row2\n this.planes_[4].set(\n vec3.set(n, m[3] + m[2], m[7] + m[6], m[11] + m[10]),\n m[15] + m[14]\n );\n\n // Far: row3 - row2\n this.planes_[5].set(\n vec3.set(n, m[3] - m[2], m[7] - m[6], m[11] - m[10]),\n m[15] - m[14]\n );\n\n for (const p of this.planes_) p.normalize();\n }\n\n public intersectsWithBox3(box: Box3) {\n const v = vec3.create();\n for (const plane of this.planes_) {\n const n = plane.normal;\n v[0] = n[0] > 0 ? box.max[0] : box.min[0];\n v[1] = n[1] > 0 ? box.max[1] : box.min[1];\n v[2] = n[2] > 0 ? box.max[2] : box.min[2];\n if (plane.signedDistanceToPoint(v) < 0) return false;\n }\n return true;\n }\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { Frustum } from \"../../math/frustum\";\nimport { mat4, vec3, vec4 } from \"gl-matrix\";\n\nexport type CameraType = \"OrthographicCamera\" | \"PerspectiveCamera\";\n\nexport abstract class Camera extends RenderableObject {\n protected projectionMatrix_ = mat4.create();\n protected near_ = 0;\n protected far_ = 0;\n\n protected abstract updateProjectionMatrix(): void;\n\n public abstract get type(): CameraType;\n\n public update() {\n this.updateProjectionMatrix();\n }\n\n get projectionMatrix() {\n return this.projectionMatrix_;\n }\n\n get viewMatrix() {\n return this.transform.inverse;\n }\n\n get right() {\n const m = this.transform.matrix;\n return vec3.fromValues(m[0], m[1], m[2]);\n }\n\n get up() {\n const m = this.transform.matrix;\n return vec3.fromValues(m[4], m[5], m[6]);\n }\n\n get frustum() {\n return new Frustum(\n mat4.multiply(mat4.create(), this.projectionMatrix, this.viewMatrix)\n );\n }\n\n public abstract setAspectRatio(aspectRatio: number): void;\n public abstract zoom(factor: number): void;\n\n public pan(vec: vec3) {\n this.transform.addTranslation(vec);\n }\n\n public get position() {\n return this.transform.translation;\n }\n\n public clipToWorld(position: vec3): vec3 {\n const clipPos = vec4.fromValues(position[0], position[1], position[2], 1);\n const projectionInverse = mat4.invert(\n mat4.create(),\n this.projectionMatrix_\n );\n const viewPos = vec4.transformMat4(\n vec4.create(),\n clipPos,\n projectionInverse\n );\n vec4.scale(viewPos, viewPos, 1 / viewPos[3]);\n // the camera transform is *not* inverted here because we use the inverse when rendering\n const worldPos = vec4.transformMat4(\n vec4.create(),\n viewPos,\n this.transform.matrix\n );\n return vec3.fromValues(worldPos[0], worldPos[1], worldPos[2]);\n }\n}\n","import { Camera, CameraType } from \"./camera\";\nimport { vec2, vec4, mat4 } from \"gl-matrix\";\nimport { Box2 } from \"../../math/box2\";\n\nconst DEFAULT_ASPECT_RATIO = 1.77; // 16:9\nconst DEFAULT_WIDTH = 128;\nconst DEFAULT_HEIGHT = 128 / DEFAULT_ASPECT_RATIO;\n\nexport class OrthographicCamera extends Camera {\n // width_ and height_ should always be defined by constructor (see setFrame)\n private width_: number = DEFAULT_WIDTH;\n private height_: number = DEFAULT_HEIGHT;\n private viewportAspectRatio_: number = DEFAULT_ASPECT_RATIO;\n private viewportSize_: [number, number] = [DEFAULT_WIDTH, DEFAULT_HEIGHT];\n\n constructor(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near = 0.0,\n far = 100.0\n ) {\n super();\n this.near_ = near;\n this.far_ = far;\n this.setFrame(left, right, bottom, top);\n this.updateProjectionMatrix();\n }\n\n public get viewportSize() {\n return this.viewportSize_;\n }\n\n public setAspectRatio(aspectRatio: number) {\n this.viewportAspectRatio_ = aspectRatio;\n this.updateProjectionMatrix();\n }\n\n public setFrame(left: number, right: number, bottom: number, top: number) {\n this.width_ = Math.abs(right - left);\n this.height_ = Math.abs(top - bottom);\n this.updateProjectionMatrix();\n const centerX = 0.5 * (left + right);\n const centerY = 0.5 * (bottom + top);\n this.transform.setTranslation([centerX, centerY, 0]);\n this.transform.setScale([1, 1, 1]);\n this.transform.setRotation([0, 0, 0, 1]);\n }\n\n public get type(): CameraType {\n return \"OrthographicCamera\";\n }\n\n public zoom(factor: number) {\n if (factor <= 0) {\n throw new Error(`Invalid zoom factor: ${factor}`);\n }\n const inverseFactor = 1.0 / factor;\n this.transform.addScale([inverseFactor, inverseFactor, 1.0]);\n }\n\n public getWorldViewRect(): Box2 {\n let topLeft = vec4.fromValues(-1.0, -1.0, 0.0, 1.0);\n let bottomRight = vec4.fromValues(1.0, 1.0, 0.0, 1.0);\n\n const viewProjection = mat4.multiply(\n mat4.create(),\n this.projectionMatrix,\n this.viewMatrix\n );\n\n const inv = mat4.invert(mat4.create(), viewProjection);\n topLeft = vec4.transformMat4(vec4.create(), topLeft, inv);\n bottomRight = vec4.transformMat4(vec4.create(), bottomRight, inv);\n\n return new Box2(\n vec2.fromValues(topLeft[0], topLeft[1]),\n vec2.fromValues(bottomRight[0], bottomRight[1])\n );\n }\n\n protected updateProjectionMatrix() {\n // The following code ensures that the orthographic projection matrix\n // is updated so that the aspect ratio of renderable objects is respected\n // (e.g. image pixels are isotropic) by padding the camera frame to form\n // the viewport frame.\n const width = this.width_;\n const height = this.height_;\n const frameAspectRatio = width / height;\n // When the viewport is wider than the camera frame, add horizontal\n // padding such that the height is unchanged. Otherwise, add vertical\n // padding such that the width is unchanged.\n let viewportHalfWidth = 0.5 * width;\n let viewportHalfHeight = 0.5 * height;\n if (this.viewportAspectRatio_ > frameAspectRatio) {\n viewportHalfWidth *= this.viewportAspectRatio_ / frameAspectRatio;\n } else {\n viewportHalfHeight *= frameAspectRatio / this.viewportAspectRatio_;\n }\n this.viewportSize_ = [2 * viewportHalfWidth, 2 * viewportHalfHeight];\n // Center the camera frame in the padded viewport frame.\n mat4.ortho(\n this.projectionMatrix_,\n -viewportHalfWidth,\n viewportHalfWidth,\n -viewportHalfHeight,\n viewportHalfHeight,\n this.near_,\n this.far_\n );\n }\n}\n","import { Camera, CameraType } from \"./camera\";\nimport { glMatrix, mat4, vec3 } from \"gl-matrix\";\n\nconst DEFAULT_FOV = 60; // degrees\nconst DEFAULT_ASPECT_RATIO = 1.77; // 16:9\nconst MIN_FOV = 0.1; // degrees\nconst MAX_FOV = 180 - MIN_FOV; // degrees\n\ntype PerspectiveCameraOptions = {\n fov?: number;\n aspectRatio?: number;\n near?: number;\n far?: number;\n position?: vec3;\n};\n\nexport class PerspectiveCamera extends Camera {\n private fov_: number;\n private aspectRatio_: number;\n\n constructor(options: PerspectiveCameraOptions = {}) {\n const {\n fov = DEFAULT_FOV,\n aspectRatio = DEFAULT_ASPECT_RATIO,\n near = 0.1,\n far = 10000,\n position = vec3.fromValues(0, 0, 0),\n } = options;\n\n if (fov < MIN_FOV || fov > MAX_FOV) {\n throw new Error(\n `Invalid field of view: ${fov}, must be in [${MIN_FOV}, ${MAX_FOV}] degrees`\n );\n }\n super();\n this.fov_ = fov;\n this.aspectRatio_ = aspectRatio;\n this.near_ = near;\n this.far_ = far;\n\n this.transform.setTranslation(position);\n\n this.updateProjectionMatrix();\n }\n\n public setAspectRatio(aspectRatio: number) {\n this.aspectRatio_ = aspectRatio;\n this.updateProjectionMatrix();\n }\n\n public get type(): CameraType {\n return \"PerspectiveCamera\";\n }\n\n public get fov() {\n return this.fov_;\n }\n\n public zoom(factor: number) {\n if (factor <= 0) {\n throw new Error(`Invalid zoom factor: ${factor}`);\n }\n // clamp the field of view to prevent degenerate behavior\n this.fov_ = Math.max(MIN_FOV, Math.min(MAX_FOV, this.fov_ / factor));\n this.updateProjectionMatrix();\n }\n\n protected updateProjectionMatrix() {\n mat4.perspective(\n this.projectionMatrix_,\n glMatrix.toRadian(this.fov),\n this.aspectRatio_,\n this.near_,\n this.far_\n );\n }\n}\n","import { vec3 } from \"gl-matrix\";\nimport { OrthographicCamera } from \"./orthographic_camera\";\nimport { EventContext } from \"../../core/event_dispatcher\";\n\nconst LEFT_MOUSE_BUTTON = 0;\n\nexport interface CameraControls {\n onEvent(event: EventContext): void;\n}\n\nexport class PanZoomControls implements CameraControls {\n private readonly camera_: OrthographicCamera;\n private dragActive_ = false;\n private dragStart_: vec3 = vec3.create();\n\n constructor(camera: OrthographicCamera) {\n this.camera_ = camera;\n }\n\n public onEvent(event: EventContext): void {\n switch (event.type) {\n case \"wheel\":\n this.onWheel(event);\n break;\n case \"pointerdown\":\n this.onPointerDown(event);\n break;\n case \"pointermove\":\n this.onPointerMove(event);\n break;\n case \"pointerup\":\n case \"pointercancel\":\n this.onPointerEnd(event);\n break;\n }\n }\n\n private onWheel(event: EventContext) {\n if (!event.worldPos || !event.clipPos) return;\n const e = event.event as WheelEvent;\n\n // Prevent the page from scrolling, the default action for wheel events.\n e.preventDefault();\n\n const posBeforeZoom = vec3.clone(event.worldPos);\n const zoomFactor = e.deltaY < 0 ? 1.05 : 0.95;\n\n this.camera_.zoom(zoomFactor);\n\n const posAfterZoom = this.camera_.clipToWorld(event.clipPos);\n const delta = vec3.sub(vec3.create(), posBeforeZoom, posAfterZoom);\n this.camera_.pan(delta);\n }\n\n private onPointerDown(event: EventContext) {\n const e = event.event as PointerEvent;\n if (!event.worldPos || e.button !== LEFT_MOUSE_BUTTON) return;\n\n this.dragStart_ = vec3.clone(event.worldPos);\n this.dragActive_ = true;\n\n (e.target as Element)?.setPointerCapture?.(e.pointerId);\n }\n\n private onPointerMove(event: EventContext) {\n if (!this.dragActive_ || !event.worldPos) return;\n\n const delta = vec3.sub(vec3.create(), this.dragStart_, event.worldPos);\n this.camera_.pan(delta);\n }\n\n private onPointerEnd(event: EventContext) {\n const e = event.event as PointerEvent;\n if (!this.dragActive_ || e.button !== LEFT_MOUSE_BUTTON) return;\n\n this.dragActive_ = false;\n\n (e.target as Element)?.releasePointerCapture?.(e.pointerId);\n }\n}\n","import { IdetikContext } from \"../idetik\";\nimport { RenderableObject } from \"./renderable_object\";\nimport { clamp } from \"../utilities/clamp\";\nimport { Logger } from \"../utilities/logger\";\nimport { EventContext } from \"./event_dispatcher\";\nimport { Viewport } from \"./viewport\";\n\nexport type LayerState = \"initialized\" | \"loading\" | \"ready\";\nexport type blendMode = \"normal\" | \"additive\" | \"subtractive\" | \"multiply\";\n\ntype StateChangeCallback = (\n newState: LayerState,\n prevState?: LayerState\n) => void;\n\nexport interface LayerOptions {\n transparent?: boolean;\n opacity?: number;\n blendMode?: blendMode;\n}\n\nexport type RenderContext = {\n viewport: Viewport;\n};\n\nexport abstract class Layer {\n public abstract readonly type: string;\n\n private objects_: RenderableObject[] = [];\n private state_: LayerState = \"initialized\";\n private readonly callbacks_: StateChangeCallback[] = [];\n\n public transparent: boolean;\n private opacity_: number;\n public blendMode: blendMode;\n\n constructor({\n transparent = false,\n opacity = 1.0,\n blendMode = \"normal\",\n }: LayerOptions = {}) {\n if (opacity < 0 || opacity > 1) {\n Logger.warn(\n \"Layer\",\n `Layer opacity out of bounds: ${opacity} — clamping to [0.0, 1.0]`\n );\n }\n this.transparent = transparent;\n this.opacity_ = clamp(opacity, 0.0, 1.0);\n this.blendMode = blendMode;\n }\n\n public get opacity() {\n return this.opacity_;\n }\n\n public set opacity(value: number) {\n if (value < 0 || value > 1) {\n Logger.warn(\n \"Layer\",\n `Opacity out of bounds: ${value} — clamping to [0.0, 1.0]`\n );\n }\n this.opacity_ = clamp(value, 0.0, 1.0);\n }\n\n public abstract update(context?: RenderContext): void;\n\n public onEvent(_: EventContext): void {}\n\n // TODO: Consider making this an abstract method once chunk manager\n // integration is finalized. Most layers will likely need access to the chunk\n // manager, but for now, we allow optional overrides to avoid requiring\n // placeholder implementations.\n public async onAttached(_context: IdetikContext) {}\n\n public onDetached(_context: IdetikContext): void {}\n\n public get objects() {\n return this.objects_;\n }\n\n public get state() {\n return this.state_;\n }\n\n public addStateChangeCallback(callback: StateChangeCallback) {\n this.callbacks_.push(callback);\n }\n\n public removeStateChangeCallback(callback: StateChangeCallback) {\n const index = this.callbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.callbacks_.splice(index, 1);\n }\n\n protected setState(newState: LayerState) {\n const prevState = this.state_;\n this.state_ = newState;\n this.callbacks_.forEach((callback) => callback(newState, prevState));\n }\n\n protected addObject(object: RenderableObject) {\n this.objects_.push(object);\n }\n\n protected removeObject(object: RenderableObject) {\n const index = this.objects_.indexOf(object);\n if (index !== -1) {\n this.objects_.splice(index, 1);\n }\n }\n\n protected clearObjects() {\n this.objects_ = [];\n }\n}\n","import { vec3 } from \"gl-matrix\";\n\nimport { Geometry } from \"../../core/geometry\";\n\nexport class ProjectedLineGeometry extends Geometry {\n // this creates the geometry for a screen-space projected line\n // each point on the input path is split into two vertices\n // these are pushed in opposite directions in screen-space to create width\n // this is done in the vertex shader by moving the vertices along the path normal\n // See:\n // https://mattdesl.svbtle.com/drawing-lines-is-hard#screenspace-projected-lines_2\n // https://github.com/spite/THREE.MeshLine\n constructor(path: vec3[]) {\n super();\n this.vertexData_ = this.createVertices(path);\n this.indexData_ = this.createIndex(path.length);\n this.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n this.addAttribute({\n type: \"previous_position\",\n itemSize: 3,\n offset: 3 * Float32Array.BYTES_PER_ELEMENT,\n });\n this.addAttribute({\n type: \"next_position\",\n itemSize: 3,\n offset: 6 * Float32Array.BYTES_PER_ELEMENT,\n });\n this.addAttribute({\n type: \"direction\",\n itemSize: 1,\n offset: 9 * Float32Array.BYTES_PER_ELEMENT,\n });\n this.addAttribute({\n type: \"path_proportion\",\n itemSize: 1,\n offset: 10 * Float32Array.BYTES_PER_ELEMENT,\n });\n }\n\n private createVertices(path: vec3[]): Float32Array {\n const vertices = new Float32Array(2 * path.length * (3 + 3 + 3 + 1 + 1));\n\n let c = 0;\n let path_proportion = 0.0;\n const total_distance = path.reduce((acc, curr, i) => {\n return acc + vec3.distance(curr, path[i + 1] ?? curr);\n }, 0.0);\n for (const i of [...Array(path.length).keys()]) {\n for (const direction of [-1.0, 1.0]) {\n const current = path[i];\n vertices[c++] = current[0];\n vertices[c++] = current[1];\n vertices[c++] = current[2];\n\n const previous = path[i - 1] ?? path[i];\n vertices[c++] = previous[0];\n vertices[c++] = previous[1];\n vertices[c++] = previous[2];\n\n const next = path[i + 1] ?? path[i];\n vertices[c++] = next[0];\n vertices[c++] = next[1];\n vertices[c++] = next[2];\n\n vertices[c++] = direction;\n vertices[c++] = path_proportion;\n }\n path_proportion +=\n vec3.distance(path[i], path[i + 1] ?? path[i]) / total_distance;\n }\n\n return vertices;\n }\n\n private createIndex(length: number): Uint32Array {\n // each line segment is a quad split into two triangles\n // 0 ----- 2\n // | / | ^\n // | / | +direction\n // point a / point b\n // | / | -direction\n // | / | v\n // 1 ----- 3\n\n const indices = new Uint32Array((length - 1) * 6);\n let c = 0;\n\n for (let i = 0; i < 2 * length; i += 2) {\n indices[c++] = i + 0;\n indices[c++] = i + 1;\n indices[c++] = i + 2;\n\n indices[c++] = i + 2;\n indices[c++] = i + 1;\n indices[c++] = i + 3;\n }\n return indices;\n }\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { ProjectedLineGeometry } from \"../../objects/geometry/projected_line_geometry\";\nimport { Color, ColorLike } from \"../../core/color\";\n\ntype LineParameters = {\n geometry: ProjectedLineGeometry;\n color: ColorLike;\n width: number;\n taperOffset?: number;\n taperPower?: number;\n};\n\nexport class ProjectedLine extends RenderableObject {\n private color_: Color;\n private width_: number;\n private taperOffset_: number = 0.5;\n private taperPower_: number = 0.0;\n\n constructor({\n geometry,\n color,\n width,\n taperOffset,\n taperPower,\n }: LineParameters) {\n super();\n this.geometry = geometry;\n this.color_ = Color.from(color);\n this.width_ = width;\n this.taperOffset_ = taperOffset ?? this.taperOffset_;\n this.taperPower_ = taperPower ?? this.taperPower_;\n this.programName = \"projectedLine\";\n }\n\n public get type() {\n return \"ProjectedLine\";\n }\n\n public get color(): Color {\n return this.color_;\n }\n\n public set color(value: ColorLike) {\n this.color_ = Color.from(value);\n }\n\n public get width() {\n return this.width_;\n }\n\n public set width(value: number) {\n this.width_ = value;\n }\n\n public get taperOffset() {\n return this.taperOffset_;\n }\n\n public set taperOffset(value: number) {\n this.taperOffset_ = value;\n }\n\n public get taperPower() {\n return this.taperPower_;\n }\n\n public set taperPower(value: number) {\n this.taperPower_ = value;\n }\n\n public override getUniforms() {\n return {\n LineColor: this.color.rgb,\n LineWidth: this.width,\n TaperOffset: this.taperOffset,\n TaperPower: this.taperPower,\n };\n }\n}\n","import { Layer } from \"../core/layer\";\nimport { ProjectedLineGeometry } from \"../objects/geometry/projected_line_geometry\";\nimport { ProjectedLine } from \"../objects/renderable/projected_line\";\n\nexport class AxesLayer extends Layer {\n public readonly type = \"AxesLayer\";\n\n constructor(params: { length: number; width: number }) {\n super();\n const { length, width } = params;\n this.addObject(\n makeAxis({\n end: [length, 0, 0],\n width: width,\n color: [1, 0, 0],\n })\n );\n this.addObject(\n makeAxis({\n end: [0, length, 0],\n width: width,\n color: [0, 1, 0],\n })\n );\n this.addObject(\n makeAxis({\n end: [0, 0, length],\n width: width,\n color: [0, 0, 1],\n })\n );\n this.setState(\"ready\");\n }\n\n public update() {}\n}\n\nfunction makeAxis(params: {\n end: [number, number, number];\n width: number;\n color: [number, number, number];\n}) {\n const { end, width, color } = params;\n const geometry = new ProjectedLineGeometry([[0, 0, 0], end]);\n return new ProjectedLine({\n geometry: geometry,\n color: color,\n width: width,\n });\n}\n","import { vec3 } from \"gl-matrix\";\nimport { Layer } from \"../core/layer\";\nimport { ProjectedLine } from \"../objects/renderable/projected_line\";\nimport { ProjectedLineGeometry } from \"../objects/geometry/projected_line_geometry\";\n\ntype LineParameters = {\n path: vec3[];\n color: vec3;\n width: number;\n};\n\nexport class ProjectedLineLayer extends Layer {\n public readonly type = \"ProjectedLineLayer\";\n\n private paths_: vec3[][] = [];\n\n constructor(lines: LineParameters[] = []) {\n super();\n lines.forEach((line) => this.addLine(line));\n this.setState(\"ready\");\n }\n\n private addLine(line: LineParameters) {\n const { path, color, width } = line;\n this.paths_.push(path);\n const geometry = new ProjectedLineGeometry(path);\n this.addObject(new ProjectedLine({ geometry, color, width }));\n }\n\n public update() {}\n\n // TODO: this is temporary - we may want to generalize this to all layers\n // for now it is used to set the initial camera position to be centered on the tracks\n public get extent() {\n return getPathBoundingBox(this.paths_.flat());\n }\n}\n\ntype BoundingBox3D = {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n zMin: number;\n zMax: number;\n};\n\nfunction getPathBoundingBox(path: vec3[]): BoundingBox3D {\n function getAxisBounds(index: number): [number, number] {\n const values = path.map((point) => point[index]);\n return [Math.min(...values), Math.max(...values)];\n }\n\n const [xMin, xMax] = getAxisBounds(0);\n const [yMin, yMax] = getAxisBounds(1);\n const [zMin, zMax] = getAxisBounds(2);\n\n return { xMin, xMax, yMin, yMax, zMin, zMax };\n}\n","import { vec3 } from \"gl-matrix\";\nimport { Layer } from \"../core/layer\";\nimport { ProjectedLine } from \"../objects/renderable/projected_line\";\nimport { ProjectedLineGeometry } from \"../objects/geometry/projected_line_geometry\";\n\ntype TrackParameters = {\n path: vec3[];\n interpolation?: { pointsPerSegment: number; tangentFactor?: number };\n time?: number[];\n color: vec3;\n width: number;\n};\n\nexport class TracksLayer extends Layer {\n public readonly type = \"TracksLayer\";\n\n private tracks_: TrackParameters[] = [];\n\n constructor(tracks: TrackParameters[] = []) {\n super();\n tracks.forEach((track) => this.addLine(track));\n this.setState(\"ready\");\n }\n\n private addLine(track: TrackParameters) {\n this.tracks_.push(track);\n let geometry;\n if (track.interpolation) {\n const interpolatedPath = cubicBezierInterpolation({\n path: track.path,\n pointsPerSegment: track.interpolation.pointsPerSegment,\n tangentFactor: track.interpolation.tangentFactor,\n });\n geometry = new ProjectedLineGeometry(interpolatedPath);\n } else {\n geometry = new ProjectedLineGeometry(track.path);\n }\n const { color, width } = track;\n const taperOffset = 0.5;\n const taperPower = 1.5;\n this.addObject(\n new ProjectedLine({ geometry, color, width, taperOffset, taperPower })\n );\n }\n\n public setTimeIndex(index: number) {\n for (const [i, track] of this.tracks_.entries()) {\n if (!track.time) {\n continue;\n }\n let offset = 0.5;\n if (index < track.time[0]) {\n offset = -1.5;\n } else if (index > track.time[track.time.length - 1]) {\n offset = 1.5;\n }\n const timeIndex = track.time.findIndex((time) => time === index);\n if (track.time && timeIndex !== -1) {\n offset = timeIndex / (track.time.length - 1);\n }\n const object = this.objects[i] as ProjectedLine;\n object.taperOffset = offset;\n }\n }\n\n public update() {}\n\n // TODO: this is temporary - we may want to generalize this to all layers\n // for now it is used to set the initial camera position to be centered on the tracks\n public get extent() {\n const paths = this.tracks_.map((track) => track.path);\n return getPathBoundingBox(paths.flat());\n }\n}\n\ntype BoundingBox3D = {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n zMin: number;\n zMax: number;\n};\n\nfunction getPathBoundingBox(path: vec3[]): BoundingBox3D {\n function getAxisBounds(index: number): [number, number] {\n const values = path.map((point) => point[index]);\n return [Math.min(...values), Math.max(...values)];\n }\n\n const [xMin, xMax] = getAxisBounds(0);\n const [yMin, yMax] = getAxisBounds(1);\n const [zMin, zMax] = getAxisBounds(2);\n\n return { xMin, xMax, yMin, yMax, zMin, zMax };\n}\n\ntype BezierParams = {\n path: vec3[];\n pointsPerSegment: number;\n tangentFactor?: number;\n};\n\nfunction cubicBezierInterpolation({\n path,\n pointsPerSegment,\n tangentFactor = 1.0 / 3.0,\n}: BezierParams): vec3[] {\n const tangents = pathTangents(path);\n\n const out = Array((path.length - 1) * pointsPerSegment);\n\n // a cubic bezier curve is defined by 4 control points: a, b, c, d\n // for interpolation of a segment:\n // * a and d are the endpoints of the curve segment\n // * b and c are control points that define curvature\n // default is 1/3 of the tangent at each endpoint as the control points\n // this is equivalent to a cubic Hermite spline\n for (let i = 0; i < path.length - 1; i++) {\n const a = path[i];\n const d = path[i + 1];\n const b = vec3.clone(tangents[i]);\n vec3.scaleAndAdd(b, a, b, tangentFactor);\n const c = vec3.clone(tangents[i + 1]);\n vec3.scaleAndAdd(c, d, c, -tangentFactor);\n for (let p = 0; p < pointsPerSegment; p++) {\n const t = p / pointsPerSegment;\n const o = (out[i * pointsPerSegment + p] = vec3.create());\n vec3.bezier(o, a, b, c, d, t);\n }\n }\n\n return out;\n}\n\nfunction pathTangents(path: vec3[]): vec3[] {\n if (path.length < 2) {\n throw new Error(\"Path must contain at least 2 points\");\n }\n\n const tangents: vec3[] = Array(path.length);\n const m0 = vec3.create();\n const m1 = vec3.create();\n for (let i = 0; i < path.length; i++) {\n const curr = path[i];\n const next = path[i + 1] ?? path[i];\n\n tangents[i] = vec3.create();\n\n if (i !== 0) {\n vec3.copy(m0, m1);\n }\n\n if (i !== path.length - 1) {\n vec3.sub(m1, next, curr);\n }\n\n if (i === 0) {\n vec3.copy(tangents[i], m1);\n } else if (i == path.length - 1) {\n vec3.copy(tangents[i], m0);\n } else {\n vec3.add(tangents[i], m0, m1);\n vec3.scale(tangents[i], tangents[i], 0.5);\n }\n }\n\n return tangents;\n}\n","import { Geometry } from \"../../core/geometry\";\n\nexport class PlaneGeometry extends Geometry {\n constructor(\n width: number,\n height: number,\n widthSegments: number,\n heightSegments: number\n ) {\n super();\n const vertex: number[] = [];\n const index: number[] = [];\n\n const gridX = widthSegments;\n const gridY = heightSegments;\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n const segmentW = width / gridX;\n const segmentH = height / gridY;\n\n for (let iy = 0; iy < gridY1; ++iy) {\n const y = iy * segmentH;\n for (let ix = 0; ix < gridX1; ++ix) {\n const x = ix * segmentW;\n const u = ix / gridX;\n const v = iy / gridY;\n\n const position = [x, y, 0];\n const normals = [0, 0, 1];\n const uvs = [u, v];\n\n vertex.push(...position, ...normals, ...uvs);\n }\n }\n\n for (let iy = 0; iy < gridY; ++iy) {\n for (let ix = 0; ix < gridX; ++ix) {\n const a = ix + gridX1 * iy;\n const b = ix + gridX1 * (iy + 1);\n const c = ix + 1 + gridX1 * (iy + 1);\n const d = ix + 1 + gridX1 * iy;\n\n index.push(a, b, d);\n index.push(b, c, d);\n }\n }\n\n this.vertexData_ = new Float32Array(vertex);\n this.indexData_ = new Uint32Array(index);\n\n this.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n\n this.addAttribute({\n type: \"normal\",\n itemSize: 3,\n offset: 3 * Float32Array.BYTES_PER_ELEMENT,\n });\n\n this.addAttribute({\n type: \"uv\",\n itemSize: 2,\n offset: 6 * Float32Array.BYTES_PER_ELEMENT,\n });\n }\n}\n","import { Node } from \"../../core/node\";\n\nexport type TextureFilter = \"nearest\" | \"linear\";\n\nexport type TextureWrapMode = \"repeat\" | \"clamp_to_edge\";\n\nexport type TextureDataFormat = \"scalar\" | \"rgb\" | \"rgba\";\n\nexport type TextureDataType =\n | \"byte\"\n | \"short\"\n | \"int\"\n | \"unsigned_byte\"\n | \"unsigned_short\"\n | \"unsigned_int\"\n | \"float\";\n\nexport type TextureUnpackRowAlignment = 1 | 2 | 4 | 8;\n\nexport type DataTextureTypedArray =\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Float32Array;\n\nexport function isTextureUnpackRowAlignment(\n value: number\n): value is TextureUnpackRowAlignment {\n return value === 1 || value === 2 || value === 4 || value === 8;\n}\n\nexport function bufferToDataType(\n buffer: DataTextureTypedArray\n): TextureDataType {\n if (buffer instanceof Int8Array) {\n return \"byte\";\n } else if (buffer instanceof Int16Array) {\n return \"short\";\n } else if (buffer instanceof Int32Array) {\n return \"int\";\n } else if (buffer instanceof Uint8Array) {\n return \"unsigned_byte\";\n } else if (buffer instanceof Uint16Array) {\n return \"unsigned_short\";\n } else if (buffer instanceof Uint32Array) {\n return \"unsigned_int\";\n } else if (buffer instanceof Float32Array) {\n return \"float\";\n }\n throw new Error(\"Unsupported buffer type.\");\n}\n\nexport function textureDefaultValueRange(texture: Texture): [number, number] {\n if (texture.dataFormat === \"rgb\" || texture.dataFormat === \"rgba\") {\n return [0, 1];\n }\n switch (texture.dataType) {\n case \"byte\":\n return [-128, 127];\n case \"short\":\n return [-32768, 32767];\n case \"int\":\n return [-2147483648, 2147483647];\n case \"unsigned_byte\":\n return [0, 255];\n case \"unsigned_short\":\n return [0, 65535];\n case \"unsigned_int\":\n return [0, 4294967295];\n case \"float\":\n return [0, 1];\n }\n}\n\nexport abstract class Texture extends Node {\n public dataFormat: TextureDataFormat = \"rgba\";\n public dataType: TextureDataType = \"unsigned_byte\";\n public maxFilter: TextureFilter = \"nearest\";\n public minFilter: TextureFilter = \"nearest\";\n public mipmapLevels = 1;\n public unpackAlignment: TextureUnpackRowAlignment = 4;\n public wrapR: TextureWrapMode = \"clamp_to_edge\";\n public wrapS: TextureWrapMode = \"clamp_to_edge\";\n public wrapT: TextureWrapMode = \"clamp_to_edge\";\n public needsUpdate = true;\n\n public abstract get width(): number;\n public abstract get height(): number;\n public abstract get data(): TexImageSource | ArrayBufferView | null;\n public abstract set data(data: DataTextureTypedArray);\n\n public get type() {\n return \"Texture\";\n }\n}\n","// Maximum number of channels supported in multichannel images\nexport const MAX_CHANNELS = 32;\n","// TODO: move this file out of `textures`\nimport { Color, ColorLike } from \"../../core/color\";\nimport {\n Texture,\n textureDefaultValueRange,\n} from \"../../objects/textures/texture\";\nimport { MAX_CHANNELS } from \"../../core/constants\";\nimport { Texture2DArray } from \"./texture_2d_array\";\nimport { Logger } from \"../../utilities/logger\";\n\nexport type Channel = {\n visible: boolean;\n color: Color;\n contrastLimits: [number, number];\n};\n\nexport type ChannelProps = {\n visible?: boolean;\n color?: ColorLike;\n contrastLimits?: [number, number];\n};\n\n/** Layer that exposes channel controls. */\nexport interface ChannelsEnabled {\n channelProps: ChannelProps[] | undefined;\n setChannelProps(channelProps: ChannelProps[]): void;\n resetChannelProps(): void;\n addChannelChangeCallback(callback: () => void): void;\n removeChannelChangeCallback(callback: () => void): void;\n}\n\nexport function validateChannel(\n texture: Texture | null,\n { visible, color, contrastLimits }: ChannelProps\n): Channel {\n if (visible === undefined) {\n visible = true;\n }\n if (color === undefined) {\n color = Color.WHITE;\n } else {\n color = Color.from(color);\n }\n\n if (texture !== null) {\n contrastLimits = validateContrastLimits(contrastLimits, texture);\n } else if (contrastLimits === undefined) {\n Logger.debug(\n \"Channel\",\n \"No texture provided, defaulting channel contrast limits to [0, 1].\"\n );\n contrastLimits = [0, 1];\n }\n return {\n visible,\n color,\n contrastLimits,\n };\n}\n\nexport function validateChannels(\n texture: Texture | null,\n channelProps: ChannelProps[]\n): Channel[] {\n if (channelProps.length > MAX_CHANNELS) {\n throw new Error(`Maximum number of channels is ${MAX_CHANNELS}`);\n }\n\n if (texture?.type === \"Texture2DArray\") {\n const depth = (texture as Texture2DArray).depth;\n if (channelProps.length !== depth) {\n throw new Error(\n `Number of channels (${channelProps.length}) must match depth of texture (${depth}).`\n );\n }\n }\n\n return channelProps.map((props) => validateChannel(texture, props));\n}\n\nfunction validateContrastLimits(\n contrastLimits: [number, number] | undefined,\n texture: Texture\n): [number, number] {\n if (contrastLimits === undefined) {\n return textureDefaultValueRange(texture);\n }\n if (contrastLimits[1] <= contrastLimits[0]) {\n throw new Error(\n `Contrast limits must be strictly increasing: ${contrastLimits}.`\n );\n }\n return contrastLimits;\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { PlaneGeometry } from \"../../objects/geometry/plane_geometry\";\nimport { Texture, TextureDataType } from \"../../objects/textures/texture\";\nimport {\n Channel,\n ChannelProps,\n validateChannel,\n validateChannels,\n} from \"../../objects/textures/channel\";\nimport { vec3 } from \"gl-matrix\";\nimport { Shader } from \"../../renderers/shaders\";\n\ntype SingleUniformValues = {\n ImageSampler: number;\n Color: vec3;\n ValueOffset: number;\n ValueScale: number;\n ChannelCount: number;\n};\n\ntype ArrayUniformValues = {\n ImageSampler: number;\n ChannelCount: number;\n \"Visible[0]\": boolean[];\n \"Color[0]\": number[];\n \"ValueOffset[0]\": number[];\n \"ValueScale[0]\": number[];\n};\n\nexport class ImageRenderable extends RenderableObject {\n private channels_: Required<Channel>[];\n\n constructor(\n width: number,\n height: number,\n texture: Texture,\n channels: ChannelProps[] = []\n ) {\n super();\n this.geometry = new PlaneGeometry(width, height, 1, 1);\n this.setTexture(0, texture);\n this.channels_ = validateChannels(texture, channels);\n this.programName = textureToShader(texture);\n }\n\n public get type() {\n return \"ImageRenderable\";\n }\n\n public setChannelProps(channels: ChannelProps[]) {\n this.channels_ = validateChannels(this.textures[0], channels);\n }\n\n public setChannelProperty<K extends keyof ChannelProps>(\n channelIndex: number,\n property: K,\n value: Required<ChannelProps>[K]\n ) {\n const newChannel = validateChannel(this.textures[0], {\n ...this.channels_[channelIndex],\n [property]: value,\n });\n\n this.channels_[channelIndex] = newChannel;\n }\n\n public override getUniforms(): SingleUniformValues | ArrayUniformValues {\n const texture = this.textures[0];\n if (!texture) {\n throw new Error(\"No texture set\");\n }\n\n if (texture.type === \"Texture2D\") {\n const { color, contrastLimits } =\n this.channels_[0] ?? validateChannel(texture, {});\n return {\n ImageSampler: 0,\n Color: color.rgb,\n ValueOffset: -contrastLimits[0],\n ValueScale: 1 / (contrastLimits[1] - contrastLimits[0]),\n ChannelCount: 1,\n };\n } else {\n // Texture2DArray case\n const visible: boolean[] = [];\n const color: number[] = [];\n const valueOffset: number[] = [];\n const valueScale: number[] = [];\n\n // All channels (including defaults) are already in this.channels_\n this.channels_.forEach((channel) => {\n visible.push(channel.visible);\n color.push(...channel.color.rgb);\n valueOffset.push(-channel.contrastLimits[0]);\n valueScale.push(\n 1 / (channel.contrastLimits[1] - channel.contrastLimits[0])\n );\n });\n\n return {\n ImageSampler: 0,\n \"Visible[0]\": visible,\n \"Color[0]\": color,\n \"ValueOffset[0]\": valueOffset,\n \"ValueScale[0]\": valueScale,\n ChannelCount: this.channels_.length,\n };\n }\n }\n}\n\nfunction textureToShader(texture: Texture) {\n if (texture.type === \"Texture2D\") {\n return dataTypeToScalarImageShader(texture.dataType);\n } else if (texture.type === \"Texture2DArray\") {\n return dataTypeToArrayImageShader(texture.dataType);\n }\n throw new Error(`Unsupported image texture type: ${texture.type}`);\n}\n\nfunction dataTypeToScalarImageShader(dataType: TextureDataType): Shader {\n switch (dataType) {\n case \"byte\":\n case \"int\":\n case \"short\":\n return \"intScalarImage\";\n case \"unsigned_short\":\n case \"unsigned_byte\":\n case \"unsigned_int\":\n return \"uintScalarImage\";\n case \"float\":\n return \"floatScalarImage\";\n }\n}\n\nfunction dataTypeToArrayImageShader(dataType: TextureDataType): Shader {\n switch (dataType) {\n case \"byte\":\n case \"int\":\n case \"short\":\n return \"intScalarImageArray\";\n case \"unsigned_short\":\n case \"unsigned_byte\":\n case \"unsigned_int\":\n return \"uintScalarImageArray\";\n case \"float\":\n return \"floatScalarImageArray\";\n }\n}\n","import {\n DataTextureTypedArray,\n Texture,\n bufferToDataType,\n} from \"../../objects/textures/texture\";\n\nimport { Chunk, ChunkData } from \"../../data/chunk\";\nexport class Texture2DArray extends Texture {\n private data_: DataTextureTypedArray;\n private readonly width_: number;\n private readonly height_: number;\n private readonly depth_: number;\n\n constructor(data: DataTextureTypedArray, width: number, height: number) {\n super();\n this.dataFormat = \"scalar\";\n this.dataType = bufferToDataType(data);\n\n this.data_ = data;\n this.width_ = width;\n this.height_ = height;\n // We currently assume that each slice's size is equal to the image's area\n this.depth_ = data.length / (width * height);\n }\n\n public get type() {\n return \"Texture2DArray\";\n }\n\n public set data(data: DataTextureTypedArray) {\n this.data_ = data;\n this.needsUpdate = true;\n }\n\n public get data() {\n return this.data_;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public get depth() {\n return this.depth_;\n }\n\n public updateWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to update texture, chunk data is not initialized.\"\n );\n }\n\n if (this.data === source) return;\n\n const width = chunk.shape.x;\n const height = chunk.shape.y;\n const depth = source.length / (width * height);\n if (\n this.width != width ||\n this.height != height ||\n this.depth_ != depth ||\n this.dataType != bufferToDataType(source)\n ) {\n throw new Error(\"Unable to update texture, texture buffer mismatch.\");\n }\n\n this.data = source;\n }\n\n public static createWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to create texture, chunk data is not initialized.\"\n );\n }\n const texture = new Texture2DArray(source, chunk.shape.x, chunk.shape.y);\n texture.unpackAlignment = chunk.rowAlignmentBytes;\n return texture;\n }\n}\n","import { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\n\nexport interface PointPickingResult {\n world: vec3;\n value: number;\n}\n\nexport function handlePointPickingEvent<T>(\n event: EventContext,\n pointerDownPos: vec2 | null,\n getValueAtWorld: (world: vec3) => T | null,\n onPickValue?: (info: { world: vec3; value: T }) => void,\n dragThreshold: number = 3\n): vec2 | null {\n switch (event.type) {\n case \"pointerdown\": {\n const e = event.event as PointerEvent;\n return vec2.fromValues(e.clientX, e.clientY);\n }\n\n case \"pointerup\": {\n if (!pointerDownPos) return pointerDownPos;\n\n const e = event.event as PointerEvent;\n const pointerUpPos = vec2.fromValues(e.clientX, e.clientY);\n const dist = vec2.distance(pointerDownPos, pointerUpPos);\n\n if (dist < dragThreshold) {\n if (!onPickValue) return null;\n\n const world = event.worldPos;\n if (world) {\n const value = getValueAtWorld(world);\n if (value !== null) {\n onPickValue({ world, value });\n }\n }\n return null;\n }\n return pointerDownPos;\n }\n\n case \"pointercancel\": {\n return null;\n }\n\n default:\n return pointerDownPos;\n }\n}\n","import { RenderableObject } from \"../core/renderable_object\";\nimport { Logger } from \"./logger\";\n\nexport class RenderablePool<T extends RenderableObject> {\n private readonly bins_ = new Map<string, T[]>();\n\n acquire(key: string) {\n const bin = this.bins_.get(key);\n const item = bin?.pop();\n if (item) {\n Logger.debug(\"RenderablePool\", \"Renderable object acquired\");\n }\n return item;\n }\n\n release(key: string, item: T) {\n let bin = this.bins_.get(key);\n if (!bin) {\n bin = [];\n this.bins_.set(key, bin);\n }\n bin.push(item);\n Logger.debug(\"RenderablePool\", \"Renderable object released\");\n }\n\n clearAll(disposer?: (t: T) => void) {\n if (disposer) for (const bin of this.bins_.values()) bin.forEach(disposer);\n this.bins_.clear();\n }\n}\n","import { Layer, LayerOptions, RenderContext } from \"../core/layer\";\nimport type { IdetikContext } from \"../idetik\";\nimport { Chunk, ChunkSource, SliceCoordinates } from \"../data/chunk\";\nimport { ChunkStoreView, INTERNAL_POLICY_KEY } from \"../core/chunk_store_view\";\nimport { ImageSourcePolicy } from \"../core/image_source_policy\";\nimport { ChannelProps, ChannelsEnabled } from \"../objects/textures/channel\";\nimport { ImageRenderable } from \"../objects/renderable/image_renderable\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { Logger } from \"../utilities/logger\";\nimport { Color } from \"../core/color\";\nimport { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { handlePointPickingEvent, PointPickingResult } from \"./point_picking\";\nimport { almostEqual } from \"../utilities/almost_equal\";\nimport { clamp } from \"../utilities/clamp\";\nimport { RenderablePool } from \"../utilities/renderable_pool\";\n\nexport type ChunkedImageLayerProps = LayerOptions & {\n source: ChunkSource;\n sliceCoords: SliceCoordinates;\n policy: ImageSourcePolicy;\n channelProps?: ChannelProps[];\n onPickValue?: (info: PointPickingResult) => void;\n};\n\nexport class ChunkedImageLayer extends Layer implements ChannelsEnabled {\n public readonly type = \"ChunkedImageLayer\";\n\n private readonly source_: ChunkSource;\n private readonly sliceCoords_: SliceCoordinates;\n private readonly onPickValue_?: (info: PointPickingResult) => void;\n private readonly visibleChunks_: Map<Chunk, ImageRenderable> = new Map();\n private readonly pool_ = new RenderablePool<ImageRenderable>();\n private readonly initialChannelProps_?: ChannelProps[];\n private readonly channelChangeCallbacks_: (() => void)[] = [];\n private policy_: ImageSourcePolicy;\n private channelProps_?: ChannelProps[];\n private chunkStoreView_?: ChunkStoreView;\n private pointerDownPos_: vec2 | null = null;\n private zPrevPointWorld_?: number;\n private debugMode_ = false;\n\n private static readonly STALE_PRESENTATION_MS_ = 1000;\n private lastPresentationTimeStamp_?: DOMHighResTimeStamp;\n private lastPresentationTimeCoord_?: number;\n\n private readonly wireframeColors_ = [\n new Color(0.6, 0.3, 0.3),\n new Color(0.3, 0.6, 0.4),\n new Color(0.4, 0.4, 0.7),\n new Color(0.6, 0.5, 0.3),\n ];\n\n constructor({\n source,\n sliceCoords,\n policy,\n channelProps,\n onPickValue,\n ...layerOptions\n }: ChunkedImageLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.source_ = source;\n this.policy_ = policy;\n this.sliceCoords_ = sliceCoords;\n this.channelProps_ = channelProps;\n this.initialChannelProps_ = channelProps;\n this.onPickValue_ = onPickValue;\n }\n\n public async onAttached(context: IdetikContext) {\n if (this.chunkStoreView_) {\n throw new Error(\n \"ChunkedImageLayer cannot be attached to multiple contexts simultaneously.\"\n );\n }\n this.chunkStoreView_ = await context.chunkManager.addView(\n this.source_,\n this.policy_\n );\n }\n\n public onDetached(context: IdetikContext): void {\n this.releaseAndRemoveChunks(this.visibleChunks_.keys());\n this.clearObjects();\n if (!this.chunkStoreView_) return;\n context.chunkManager.removeView(this.chunkStoreView_);\n this.chunkStoreView_ = undefined;\n }\n\n public update(context?: RenderContext) {\n if (!context || !this.chunkStoreView_) return;\n\n this.chunkStoreView_.updateChunkStates(this.sliceCoords_, context.viewport);\n\n this.updateChunks();\n this.resliceIfZChanged();\n }\n\n private updateChunks() {\n if (!this.chunkStoreView_) return;\n if (this.state !== \"ready\") this.setState(\"ready\");\n\n if (\n this.visibleChunks_.size > 0 &&\n !this.chunkStoreView_.allVisibleLowestLODLoaded(this.sliceCoords_) &&\n !this.isPresentationStale()\n ) {\n return;\n }\n this.lastPresentationTimeStamp_ = performance.now();\n this.lastPresentationTimeCoord_ = this.sliceCoords_.t;\n\n const orderedByLOD = this.chunkStoreView_.getChunksToRender(\n this.sliceCoords_\n );\n const current = new Set(orderedByLOD);\n const nonVisibleChunks = Array.from(this.visibleChunks_.keys()).filter(\n (chunk) => !current.has(chunk)\n );\n this.releaseAndRemoveChunks(nonVisibleChunks);\n\n this.clearObjects();\n for (const chunk of orderedByLOD) {\n if (chunk.state !== \"loaded\") continue;\n const image = this.getImageForChunk(chunk);\n this.visibleChunks_.set(chunk, image);\n this.addObject(image);\n }\n }\n\n public get lastPresentationTimeCoord(): number | undefined {\n return this.lastPresentationTimeCoord_;\n }\n\n private isPresentationStale(): boolean {\n if (this.lastPresentationTimeStamp_ === undefined) return false;\n return (\n performance.now() - this.lastPresentationTimeStamp_ >\n ChunkedImageLayer.STALE_PRESENTATION_MS_\n );\n }\n\n private resliceIfZChanged() {\n const zPointWorld = this.sliceCoords_.z;\n if (zPointWorld === undefined || this.zPrevPointWorld_ === zPointWorld) {\n return;\n }\n\n for (const [chunk, image] of this.visibleChunks_) {\n if (chunk.state !== \"loaded\" || !chunk.data) continue;\n const data = this.slicePlane(chunk, zPointWorld);\n if (data) {\n const texture = image.textures[0] as Texture2DArray;\n texture.updateWithChunk(chunk, data);\n }\n }\n\n this.zPrevPointWorld_ = zPointWorld;\n }\n\n public onEvent(event: EventContext) {\n this.pointerDownPos_ = handlePointPickingEvent(\n event,\n this.pointerDownPos_,\n (world) => this.getValueAtWorld(world),\n this.onPickValue_\n );\n }\n\n // exposed for use in chunk info overlay\n public get chunkStoreView(): ChunkStoreView | undefined {\n return this.chunkStoreView_;\n }\n\n public get sliceCoords(): SliceCoordinates {\n return this.sliceCoords_;\n }\n\n public get source(): ChunkSource {\n return this.source_;\n }\n\n public get imageSourcePolicy(): Readonly<ImageSourcePolicy> {\n return this.policy_;\n }\n\n public set imageSourcePolicy(newPolicy: ImageSourcePolicy) {\n if (this.policy_ !== newPolicy) {\n this.policy_ = newPolicy;\n if (this.chunkStoreView_) {\n this.chunkStoreView_.setImageSourcePolicy(\n newPolicy,\n INTERNAL_POLICY_KEY\n );\n }\n }\n }\n\n private slicePlane(chunk: Chunk, zValue: number) {\n if (!chunk.data) return;\n const zLocal = (zValue - chunk.offset.z) / chunk.scale.z;\n const zIdx = Math.round(zLocal);\n const zClamped = clamp(zIdx, 0, chunk.shape.z - 1);\n\n // Treat values within ~1 voxel (plus tiny floating-point error) as OK.\n // Anything further away means the requested zValue is outside.\n if (!almostEqual(zLocal, zClamped, 1 + 1e-6)) {\n Logger.error(\"ImageLayer\", \"slicePlane zValue outside extent\");\n }\n\n const sliceSize = chunk.shape.x * chunk.shape.y;\n const offset = sliceSize * zClamped;\n return chunk.data.slice(offset, offset + sliceSize);\n }\n\n private getImageForChunk(chunk: Chunk) {\n const existing = this.visibleChunks_.get(chunk);\n if (existing) return existing;\n\n const pooled = this.pool_.acquire(poolKeyForImageRenderable(chunk));\n if (pooled) {\n const texture = pooled.textures[0] as Texture2DArray;\n texture.updateWithChunk(chunk, this.getDataForImage(chunk));\n this.updateImageChunk(pooled, chunk);\n if (this.channelProps_) {\n pooled.setChannelProps(this.channelProps_);\n }\n return pooled;\n }\n\n return this.createImage(chunk);\n }\n\n private createImage(chunk: Chunk) {\n const image = new ImageRenderable(\n chunk.shape.x,\n chunk.shape.y,\n Texture2DArray.createWithChunk(chunk, this.getDataForImage(chunk)),\n this.channelProps_ ?? [{}]\n );\n this.updateImageChunk(image, chunk);\n return image;\n }\n\n private getDataForImage(chunk: Chunk) {\n const data =\n this.sliceCoords_?.z !== undefined\n ? this.slicePlane(chunk, this.sliceCoords_.z)\n : chunk.data;\n if (!data) {\n Logger.warn(\"ChunkedImageLayer\", \"No data for image\");\n return;\n }\n return data;\n }\n\n private updateImageChunk(image: ImageRenderable, chunk: Chunk) {\n if (this.debugMode_) {\n image.wireframeEnabled = true;\n image.wireframeColor =\n this.wireframeColors_[chunk.lod % this.wireframeColors_.length];\n } else {\n image.wireframeEnabled = false;\n }\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n }\n\n public getValueAtWorld(world: vec3): number | null {\n const currentLOD = this.chunkStoreView_?.currentLOD ?? 0;\n\n // First, try to find the value in current LOD chunks (highest priority)\n for (const [chunk, image] of this.visibleChunks_) {\n if (chunk.lod !== currentLOD) continue;\n const value = this.getValueFromChunk(chunk, image, world);\n if (value !== null) return value;\n }\n\n // Fallback to low-res chunks if no current LOD chunk contains the position\n for (const [chunk, image] of this.visibleChunks_) {\n if (chunk.lod === currentLOD) continue;\n const value = this.getValueFromChunk(chunk, image, world);\n if (value !== null) return value;\n }\n\n return null;\n }\n\n private getValueFromChunk(\n chunk: Chunk,\n image: ImageRenderable,\n world: vec3\n ): number | null {\n if (!chunk.data) return null;\n\n const localPos = vec3.transformMat4(\n vec3.create(),\n world,\n image.transform.inverse\n );\n\n const x = Math.floor(localPos[0]);\n const y = Math.floor(localPos[1]);\n\n // Check if this chunk contains the requested position\n if (x >= 0 && x < chunk.shape.x && y >= 0 && y < chunk.shape.y) {\n const data =\n this.sliceCoords_.z !== undefined\n ? this.slicePlane(chunk, this.sliceCoords_.z)!\n : chunk.data;\n const pixelIndex = y * chunk.shape.x + x;\n\n // For multi-channel images, take the first channel value\n return data[pixelIndex];\n }\n\n return null;\n }\n\n public get debugMode(): boolean {\n return this.debugMode_;\n }\n\n public set debugMode(debug: boolean) {\n this.debugMode_ = debug;\n this.visibleChunks_.forEach((image, chunk) => {\n image.wireframeEnabled = this.debugMode_;\n if (this.debugMode_) {\n image.wireframeColor =\n this.wireframeColors_[chunk.lod % this.wireframeColors_.length];\n }\n });\n }\n\n public get channelProps(): ChannelProps[] | undefined {\n return this.channelProps_;\n }\n\n public setChannelProps(channelProps: ChannelProps[]) {\n this.channelProps_ = channelProps;\n this.visibleChunks_.forEach((image) => {\n image.setChannelProps(channelProps);\n });\n this.channelChangeCallbacks_.forEach((callback) => {\n callback();\n });\n }\n\n public resetChannelProps(): void {\n if (this.initialChannelProps_ !== undefined) {\n this.setChannelProps(this.initialChannelProps_);\n }\n }\n\n public addChannelChangeCallback(callback: () => void): void {\n this.channelChangeCallbacks_.push(callback);\n }\n\n public removeChannelChangeCallback(callback: () => void): void {\n const index = this.channelChangeCallbacks_.indexOf(callback);\n if (index === -1) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.channelChangeCallbacks_.splice(index, 1);\n }\n\n private releaseAndRemoveChunks(chunks: Iterable<Chunk>): void {\n for (const chunk of chunks) {\n const image = this.visibleChunks_.get(chunk);\n if (image) {\n this.pool_.release(poolKeyForImageRenderable(chunk), image);\n this.visibleChunks_.delete(chunk);\n }\n }\n }\n}\n\nexport function poolKeyForImageRenderable(chunk: Chunk) {\n return [\n `lod${chunk.lod}`,\n `shape${chunk.shape.x}x${chunk.shape.y}`,\n `align${chunk.rowAlignmentBytes}`,\n ].join(\":\");\n}\n","import { DataTextureTypedArray, Texture, bufferToDataType } from \"./texture\";\nimport { Chunk } from \"../../data/chunk\";\n\nexport class Texture3D extends Texture {\n private data_: DataTextureTypedArray;\n private readonly width_: number;\n private readonly height_: number;\n private readonly depth_: number;\n\n constructor(\n data: DataTextureTypedArray,\n width: number,\n height: number,\n depth: number\n ) {\n super();\n this.dataFormat = \"scalar\";\n this.dataType = bufferToDataType(data);\n\n this.data_ = data;\n this.width_ = width;\n this.height_ = height;\n this.depth_ = depth;\n }\n\n public set data(data: DataTextureTypedArray) {\n this.data_ = data;\n this.needsUpdate = true;\n }\n\n public get type() {\n return \"Texture3D\";\n }\n\n public get data() {\n return this.data_;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public get depth() {\n return this.depth_;\n }\n\n public updateWithChunk(chunk: Chunk) {\n const source = chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to update texture, chunk data is not initialized.\"\n );\n }\n\n if (this.data === source) return;\n\n if (\n this.width != chunk.shape.x ||\n this.height != chunk.shape.y ||\n this.depth != chunk.shape.z ||\n this.dataType != bufferToDataType(source)\n ) {\n throw new Error(\"Unable to update texture, texture buffer mismatch.\");\n }\n\n this.data = source;\n }\n\n public static createWithChunk(chunk: Chunk) {\n const source = chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to create texture, chunk data is not initialized.\"\n );\n }\n\n const texture = new Texture3D(\n source,\n chunk.shape.x,\n chunk.shape.y,\n chunk.shape.z\n );\n texture.unpackAlignment = chunk.rowAlignmentBytes;\n return texture;\n }\n}\n","import { Geometry } from \"../../core/geometry\";\n\ntype Axis = \"x\" | \"y\" | \"z\";\ntype Vec3Obj = Record<Axis, number>;\n\nexport class BoxGeometry extends Geometry {\n constructor(\n width: number,\n height: number,\n depth: number,\n widthSegments: number,\n heightSegments: number,\n depthSegments: number\n ) {\n super();\n\n const vertex: number[] = [];\n const index: number[] = [];\n\n const wSeg = Math.floor(widthSegments);\n const hSeg = Math.floor(heightSegments);\n const dSeg = Math.floor(depthSegments);\n\n // prettier-ignore\n {\n this.buildFace(\"z\", \"y\", \"x\", -1, -1, depth, height, width, dSeg, hSeg, +1, vertex, index); // +X\n this.buildFace(\"z\", \"y\", \"x\", +1, -1, depth, height, width, dSeg, hSeg, -1, vertex, index); // -X\n this.buildFace(\"x\", \"z\", \"y\", +1, +1, width, depth, height, wSeg, dSeg, +1, vertex, index); // +Y\n this.buildFace(\"x\", \"z\", \"y\", +1, -1, width, depth, height, wSeg, dSeg, -1, vertex, index); // -Y\n this.buildFace(\"x\", \"y\", \"z\", +1, -1, width, height, depth, wSeg, hSeg, +1, vertex, index); // +Z\n this.buildFace(\"x\", \"y\", \"z\", -1, -1, width, height, depth, wSeg, hSeg, -1, vertex, index); // -Z\n }\n\n this.vertexData_ = new Float32Array(vertex);\n this.indexData_ = new Uint32Array(index);\n\n this.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n\n this.addAttribute({\n type: \"normal\",\n itemSize: 3,\n offset: 3 * Float32Array.BYTES_PER_ELEMENT,\n });\n\n this.addAttribute({\n type: \"uv\",\n itemSize: 2,\n offset: 6 * Float32Array.BYTES_PER_ELEMENT,\n });\n }\n\n private buildFace(\n axisU: Axis,\n axisV: Axis,\n axisW: Axis,\n udir: number,\n vdir: number,\n faceWidth: number,\n faceHeight: number,\n faceDepth: number,\n gridX: number,\n gridY: number,\n wdir: number,\n vertex: number[],\n index: number[]\n ) {\n const segmentWidth = faceWidth / gridX;\n const segmentHeight = faceHeight / gridY;\n\n const widthHalf = faceWidth / 2;\n const heightHalf = faceHeight / 2;\n const depthHalf = (faceDepth / 2) * wdir;\n\n const gridX1 = gridX + 1;\n const gridY1 = gridY + 1;\n\n const vertexPosition = vertex.length / 8;\n\n for (let iy = 0; iy < gridY1; iy++) {\n const vy = -heightHalf + iy * segmentHeight;\n for (let ix = 0; ix < gridX1; ix++) {\n const vx = -widthHalf + ix * segmentWidth;\n\n const position: Vec3Obj = { x: 0, y: 0, z: 0 };\n position[axisU] = vx * udir;\n position[axisV] = vy * vdir;\n position[axisW] = depthHalf;\n\n const normal: Vec3Obj = { x: 0, y: 0, z: 0 };\n normal[axisW] = wdir;\n\n const u = ix / gridX;\n const v = 1 - iy / gridY;\n\n vertex.push(\n position.x,\n position.y,\n position.z,\n normal.x,\n normal.y,\n normal.z,\n u,\n v\n );\n }\n }\n\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = vertexPosition + ix + gridX1 * iy;\n const b = vertexPosition + ix + gridX1 * (iy + 1);\n const c = vertexPosition + (ix + 1) + gridX1 * (iy + 1);\n const d = vertexPosition + (ix + 1) + gridX1 * iy;\n if (wdir === 1) {\n index.push(a, b, d, b, c, d);\n } else {\n index.push(a, d, b, b, d, c);\n }\n }\n }\n }\n}\n","import { Shader } from \"../../renderers/shaders\";\nimport { RenderableObject } from \"../../core/renderable_object\";\nimport { BoxGeometry } from \"../geometry/box_geometry\";\nimport { TextureDataType } from \"../textures/texture\";\nimport { Texture3D } from \"../textures/texture_3d\";\n\nexport class VolumeRenderable extends RenderableObject {\n constructor(\n width: number,\n height: number,\n depth: number,\n texture: Texture3D\n ) {\n super();\n this.geometry = new BoxGeometry(width, height, depth, 1, 1, 1);\n this.cullFaceMode = \"back\";\n this.setTexture(0, texture);\n this.programName = dataTypeToVolumeShader(texture.dataType);\n }\n\n public get type() {\n return \"VolumeRenderable\";\n }\n}\n\nfunction dataTypeToVolumeShader(dataType: TextureDataType): Shader {\n switch (dataType) {\n case \"byte\":\n case \"int\":\n case \"short\":\n return \"intVolume\";\n case \"unsigned_short\":\n case \"unsigned_byte\":\n case \"unsigned_int\":\n return \"uintVolume\";\n case \"float\":\n return \"floatVolume\";\n }\n}\n","import { Layer } from \"../core/layer\";\nimport { Texture3D } from \"../objects/textures/texture_3d\";\nimport { VolumeRenderable } from \"../objects/renderable/volume_renderable\";\n\nexport class VolumeLayer extends Layer {\n public readonly type = \"VolumeLayer\";\n\n constructor() {\n super();\n\n const data = new Int8Array([127, 0, 0, 127, 127, 0, 0, 127]);\n const texture = new Texture3D(data, 2, 2, 2);\n texture.unpackAlignment = 1;\n const renderable = new VolumeRenderable(1, 1, 1, texture);\n renderable.wireframeEnabled = true;\n\n this.addObject(renderable);\n this.setState(\"ready\");\n }\n\n public update() {\n // TODO: implement\n }\n}\n","import { Layer, LayerOptions } from \"../core/layer\";\nimport { Region } from \"../data/region\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { ChannelProps, ChannelsEnabled } from \"../objects/textures/channel\";\nimport { ImageRenderable } from \"../objects/renderable/image_renderable\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { handlePointPickingEvent, PointPickingResult } from \"./point_picking\";\n\nexport type ImageLayerProps = LayerOptions & {\n source: ChunkSource;\n region: Region;\n channelProps?: ChannelProps[];\n onPickValue?: (info: PointPickingResult) => void;\n lod?: number;\n};\n\nexport class ImageLayer extends Layer implements ChannelsEnabled {\n public readonly type = \"ImageLayer\";\n\n private readonly source_: ChunkSource;\n private readonly region_: Region;\n private readonly lod_?: number;\n private readonly onPickValue_?: (info: PointPickingResult) => void;\n private readonly initialChannelProps_?: ChannelProps[];\n private readonly channelChangeCallbacks_: Array<() => void> = [];\n private channelProps_?: ChannelProps[];\n private image_?: ImageRenderable;\n private chunk_?: Chunk;\n private extent_?: { x: number; y: number };\n private pointerDownPos_: vec2 | null = null;\n\n constructor({\n source,\n region,\n channelProps,\n onPickValue,\n lod,\n ...layerOptions\n }: ImageLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.source_ = source;\n this.region_ = region;\n this.channelProps_ = channelProps;\n this.initialChannelProps_ = channelProps;\n this.onPickValue_ = onPickValue;\n this.lod_ = lod;\n }\n\n public update() {\n switch (this.state) {\n case \"initialized\":\n this.load(this.region_);\n break;\n case \"loading\":\n case \"ready\":\n break;\n default: {\n const exhaustiveCheck: never = this.state;\n throw new Error(`Unhandled LayerState case: ${exhaustiveCheck}`);\n }\n }\n }\n\n public onEvent(event: EventContext) {\n this.pointerDownPos_ = handlePointPickingEvent(\n event,\n this.pointerDownPos_,\n (world) => this.getValueAtWorld(world),\n this.onPickValue_\n );\n }\n\n public get channelProps(): ChannelProps[] | undefined {\n // TODO: should this return Channel[] instead of ChannelProps[]?\n return this.channelProps_;\n }\n\n public setChannelProps(channelProps: ChannelProps[]) {\n this.channelProps_ = channelProps;\n this.image_?.setChannelProps(channelProps);\n this.channelChangeCallbacks_.forEach((callback) => {\n callback();\n });\n }\n\n public resetChannelProps(): void {\n if (this.initialChannelProps_ !== undefined) {\n this.setChannelProps(this.initialChannelProps_);\n }\n }\n\n public addChannelChangeCallback(callback: () => void): void {\n this.channelChangeCallbacks_.push(callback);\n }\n\n public removeChannelChangeCallback(callback: () => void): void {\n const index = this.channelChangeCallbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.channelChangeCallbacks_.splice(index, 1);\n }\n\n private async load(region: Region) {\n if (this.state !== \"initialized\") {\n throw new Error(`Trying to load chunks more than once.`);\n }\n this.setState(\"loading\");\n const loader = await this.source_.open();\n const lod = this.lod_ ?? loader.getSourceDimensionMap().numLods - 1;\n\n const chunk = await loader.loadRegion(region, lod);\n this.extent_ = {\n x: chunk.shape.x * chunk.scale.x,\n y: chunk.shape.y * chunk.scale.y,\n };\n\n this.image_ = this.createImage(chunk);\n this.chunk_ = chunk;\n this.addObject(this.image_);\n\n this.setState(\"ready\");\n }\n\n // TODO: we probably want something like this, but it should be unified across layers\n // see TracksLayer for another example\n public get extent(): { x: number; y: number } | undefined {\n return this.extent_;\n }\n\n private createImage(chunk: Chunk) {\n const image = new ImageRenderable(\n chunk.shape.x,\n chunk.shape.y,\n Texture2DArray.createWithChunk(chunk),\n this.channelProps\n );\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n return image;\n }\n\n public getValueAtWorld(world: vec3): number | null {\n if (!this.image_) return null;\n if (!this.chunk_?.data) return null;\n const localPos = vec3.transformMat4(\n vec3.create(),\n world,\n this.image_.transform.inverse\n );\n\n const x = Math.floor(localPos[0]);\n const y = Math.floor(localPos[1]);\n\n // Check if this chunk contains the requested position\n if (\n x >= 0 &&\n x < this.chunk_.shape.x &&\n y >= 0 &&\n y < this.chunk_.shape.y\n ) {\n const pixelIndex = y * this.chunk_.shape.x + x;\n // For multi-channel images, take the first channel value\n return this.chunk_.data[pixelIndex];\n }\n\n return null;\n }\n}\n","import {\n DataTextureTypedArray,\n Texture,\n bufferToDataType,\n} from \"../../objects/textures/texture\";\nimport { Chunk, ChunkData } from \"../../data/chunk\";\n\nexport class Texture2D extends Texture {\n private data_: DataTextureTypedArray;\n private readonly width_: number;\n private readonly height_: number;\n\n constructor(data: DataTextureTypedArray, width: number, height: number) {\n super();\n this.dataFormat = \"scalar\";\n this.dataType = bufferToDataType(data);\n\n this.data_ = data;\n this.width_ = width;\n this.height_ = height;\n }\n\n public set data(data: DataTextureTypedArray) {\n this.data_ = data;\n this.needsUpdate = true;\n }\n\n public get type() {\n return \"Texture2D\";\n }\n\n public get data() {\n return this.data_;\n }\n\n public get width() {\n return this.width_;\n }\n\n public get height() {\n return this.height_;\n }\n\n public updateWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to update texture, chunk data is not initialized.\"\n );\n }\n\n if (this.data === source) return;\n\n if (\n this.width != chunk.shape.x ||\n this.height != chunk.shape.y ||\n this.dataType != bufferToDataType(source)\n ) {\n throw new Error(\"Unable to update texture, texture buffer mismatch.\");\n }\n\n this.data = source;\n }\n\n public static createWithChunk(chunk: Chunk, data?: ChunkData) {\n const source = data ?? chunk.data;\n if (!source) {\n throw new Error(\n \"Unable to create texture, chunk data is not initialized.\"\n );\n }\n\n const texture = new Texture2D(source, chunk.shape.x, chunk.shape.y);\n texture.unpackAlignment = chunk.rowAlignmentBytes;\n return texture;\n }\n}\n","import { Color, ColorLike } from \"../../core/color\";\n\nconst defaultColorCycle: ColorLike[] = [\n [1.0, 0.5, 0.5],\n [0.5, 1.0, 0.5],\n [0.5, 0.5, 1.0],\n [0.5, 1.0, 1.0],\n [1.0, 0.5, 1.0],\n [1.0, 1.0, 0.5],\n];\n\nfunction validateLookupTable(\n lookupTable?: ReadonlyMap<number, ColorLike>\n): ReadonlyMap<number, Color> {\n lookupTable = lookupTable ?? new Map();\n return new Map(\n Array.from(lookupTable.entries()).map(([key, value]) => [\n key,\n Color.from(value),\n ])\n );\n}\n\nfunction validateCycle(cycle?: ReadonlyArray<ColorLike>): ReadonlyArray<Color> {\n cycle = cycle ?? defaultColorCycle;\n return cycle.map(Color.from);\n}\n\nexport type LabelColorMapProps = {\n lookupTable?: ReadonlyMap<number, ColorLike>;\n cycle?: ColorLike[];\n};\n\nexport class LabelColorMap {\n public readonly lookupTable: ReadonlyMap<number, Color>;\n public readonly cycle: ReadonlyArray<Color>;\n\n constructor(props: LabelColorMapProps = {}) {\n this.lookupTable = validateLookupTable(props.lookupTable);\n this.cycle = validateCycle(props.cycle);\n }\n}\n","import { RenderableObject } from \"../../core/renderable_object\";\nimport { PlaneGeometry } from \"../../objects/geometry/plane_geometry\";\nimport { Texture, TextureDataType } from \"../../objects/textures/texture\";\nimport { Color } from \"../../core/color\";\nimport { Texture2D } from \"../textures/texture_2d\";\nimport { LabelColorMap } from \"./label_color_map\";\n\ntype LabelImageRenderableProps = {\n width: number;\n height: number;\n imageData: Texture;\n colorMap: LabelColorMap;\n outlineSelected?: boolean;\n selectedValue?: number | null;\n};\n\nconst supportedDataTypes = new Set<TextureDataType>([\n \"unsigned_byte\",\n \"unsigned_short\",\n \"unsigned_int\",\n]);\n\nfunction validateImageData(imageData: Texture) {\n if (imageData.dataFormat !== \"scalar\") {\n throw new Error(\n `Image data format must be scalar, instead found: ${imageData.dataFormat}`\n );\n }\n if (!supportedDataTypes.has(imageData.dataType)) {\n throw new Error(\n `Image data type must be unsigned, instead found: ${imageData.dataType}`\n );\n }\n return imageData;\n}\n\nexport class LabelImageRenderable extends RenderableObject {\n private outlineSelected_: boolean;\n private selectedValue_: number | null;\n\n constructor(props: LabelImageRenderableProps) {\n super();\n this.geometry = new PlaneGeometry(props.width, props.height, 1, 1);\n this.setTexture(0, validateImageData(props.imageData));\n const colorCycleTexture = this.makeColorCycleTexture(props.colorMap.cycle);\n this.setTexture(1, colorCycleTexture);\n const colorLookupTableTexture = this.makeColorLookupTableTexture(\n props.colorMap.lookupTable\n );\n this.setTexture(2, colorLookupTableTexture);\n this.outlineSelected_ = props.outlineSelected ?? false;\n this.selectedValue_ = props.selectedValue ?? null;\n this.programName = \"labelImage\";\n }\n\n public get type() {\n return \"LabelImageRenderable\";\n }\n\n public getUniforms() {\n return {\n ImageSampler: 0,\n ColorCycleSampler: 1,\n ColorLookupTableSampler: 2,\n u_outlineSelected: this.outlineSelected_ ? 1.0 : 0.0,\n u_selectedValue: this.selectedValue_ ?? -1.0,\n };\n }\n\n public setColorMap(colorMap: LabelColorMap) {\n this.setTexture(1, this.makeColorCycleTexture(colorMap.cycle));\n this.setTexture(2, this.makeColorLookupTableTexture(colorMap.lookupTable));\n }\n\n public setSelectedValue(value: number | null) {\n this.selectedValue_ = value;\n }\n\n private makeColorCycleTexture(cycle: ReadonlyArray<Color>) {\n const data = new Uint8Array(\n cycle.flatMap((c) => c.rgba).map((v) => Math.round(v * 255))\n );\n const texture = new Texture2D(data, cycle.length, 1);\n texture.dataFormat = \"rgba\";\n return texture;\n }\n\n private makeColorLookupTableTexture(\n lookupTable?: ReadonlyMap<number, Color>\n ) {\n if (lookupTable === undefined) {\n lookupTable = new Map([[0, Color.TRANSPARENT]]);\n } else if (!lookupTable.has(0)) {\n lookupTable = new Map([[0, Color.TRANSPARENT], ...lookupTable]);\n }\n const keys = Array.from(lookupTable.keys());\n const values = Array.from(lookupTable.values()).map((c) => c.packed);\n const numColors = lookupTable.size;\n const data = new Uint32Array(numColors * 2);\n data.set(keys, 0);\n data.set(values, numColors);\n return new Texture2D(data, numColors, 2);\n }\n}\n","import { Layer, LayerOptions } from \"../core/layer\";\nimport { Region } from \"../data/region\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { Texture2D } from \"../objects/textures/texture_2d\";\nimport {\n LabelColorMap,\n LabelColorMapProps,\n} from \"../objects/renderable/label_color_map\";\nimport { LabelImageRenderable } from \"../objects/renderable/label_image_renderable\";\nimport { EventContext } from \"../core/event_dispatcher\";\nimport { vec2, vec3 } from \"gl-matrix\";\nimport { handlePointPickingEvent, PointPickingResult } from \"./point_picking\";\n\nexport type LabelImageLayerProps = LayerOptions & {\n source: ChunkSource;\n region: Region;\n colorMap?: LabelColorMapProps;\n onPickValue?: (info: PointPickingResult) => void;\n lod?: number;\n outlineSelected?: boolean;\n};\n\nexport class LabelImageLayer extends Layer {\n public readonly type = \"LabelImageLayer\";\n\n private readonly source_: ChunkSource;\n private readonly region_: Region;\n private readonly lod_?: number;\n private colorMap_: LabelColorMap;\n private readonly onPickValue_?: (info: PointPickingResult) => void;\n private readonly outlineSelected_: boolean;\n private image_?: LabelImageRenderable;\n private imageChunk_?: Chunk;\n private pointerDownPos_: vec2 | null = null;\n private selectedValue_: number | null = null;\n\n constructor({\n source,\n region,\n colorMap = {},\n onPickValue,\n lod,\n outlineSelected = false,\n ...layerOptions\n }: LabelImageLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.source_ = source;\n this.region_ = region;\n this.colorMap_ = new LabelColorMap(colorMap);\n this.onPickValue_ = onPickValue;\n this.lod_ = lod;\n this.outlineSelected_ = outlineSelected;\n }\n\n public update() {\n switch (this.state) {\n case \"initialized\":\n this.load(this.region_);\n break;\n case \"loading\":\n case \"ready\":\n break;\n default: {\n const exhaustiveCheck: never = this.state;\n throw new Error(`Unhandled LayerState case: ${exhaustiveCheck}`);\n }\n }\n }\n\n public get colorMap(): LabelColorMap {\n return this.colorMap_;\n }\n\n public setColorMap(colorMap: LabelColorMapProps) {\n this.colorMap_ = new LabelColorMap(colorMap);\n if (this.image_) {\n this.image_.setColorMap(this.colorMap_);\n }\n }\n\n public setSelectedValue(value: number | null) {\n this.selectedValue_ = value;\n if (this.image_) {\n this.image_.setSelectedValue(this.selectedValue_);\n }\n }\n\n public onEvent(event: EventContext) {\n this.pointerDownPos_ = handlePointPickingEvent(\n event,\n this.pointerDownPos_,\n (world) => this.getValueAtWorld(world),\n this.outlineSelected_\n ? (info: PointPickingResult) => {\n this.setSelectedValue(info.value);\n this.onPickValue_?.(info);\n }\n : this.onPickValue_\n );\n }\n\n private async load(region: Region) {\n if (this.state !== \"initialized\") {\n throw new Error(`Trying to load chunks more than once.`);\n }\n this.setState(\"loading\");\n const loader = await this.source_.open();\n const lod = this.lod_ ?? loader.getSourceDimensionMap().numLods - 1;\n const chunk = await loader.loadRegion(region, lod);\n this.image_ = this.createImage(chunk);\n this.addObject(this.image_);\n this.setState(\"ready\");\n }\n\n private createImage(chunk: Chunk) {\n this.imageChunk_ = chunk; // Store chunk for value picking\n const image = new LabelImageRenderable({\n width: chunk.shape.x,\n height: chunk.shape.y,\n imageData: Texture2D.createWithChunk(chunk),\n colorMap: this.colorMap_,\n outlineSelected: this.outlineSelected_,\n selectedValue: this.selectedValue_,\n });\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n return image;\n }\n\n public getValueAtWorld(world: vec3): number | null {\n if (!this.image_ || !this.imageChunk_?.data) {\n return null;\n }\n\n // Transform world to local texture coordinates using inverse transform\n const localPos = vec3.transformMat4(\n vec3.create(),\n world,\n this.image_.transform.inverse\n );\n\n // Convert to pixel coordinates and bounds check\n const x = Math.floor(localPos[0]);\n const y = Math.floor(localPos[1]);\n if (\n x < 0 ||\n x >= this.imageChunk_.shape.x ||\n y < 0 ||\n y >= this.imageChunk_.shape.y\n ) {\n return null;\n }\n\n const pixelIndex = y * this.imageChunk_.shape.x + x;\n const data = this.imageChunk_.data;\n return data[pixelIndex];\n }\n}\n","export class AbortError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AbortError\";\n // Manually adjust the prototype to handle sub-classing Error\n // https://github.com/microsoft/TypeScript/wiki/FAQ#why-doesnt-extending-built-ins-like-error-array-and-map-work\n Object.setPrototypeOf(this, AbortError.prototype);\n }\n}\n\n// Executes a limited number of promises concurrently.\nexport class PromiseScheduler {\n private readonly maxConcurrent_: number;\n private readonly pending_: Array<() => Promise<void>> = [];\n private readonly abortController_ = new AbortController();\n private numRunning_ = 0;\n\n constructor(maxConcurrent: number) {\n if (maxConcurrent <= 0) {\n throw Error(`maxConcurrent (${maxConcurrent}) must be positive`);\n }\n this.maxConcurrent_ = maxConcurrent;\n }\n\n async submit<T>(task: () => Promise<T>): Promise<T> {\n this.abortController_.signal.throwIfAborted();\n return new Promise((resolve, reject) => {\n const promise = async () => {\n try {\n this.abortController_.signal.throwIfAborted();\n const result = await task();\n resolve(result);\n } catch (error) {\n reject(error);\n } finally {\n this.numRunning_--;\n this.maybeRunNext();\n }\n };\n this.pending_.push(promise);\n this.maybeRunNext();\n });\n }\n\n private maybeRunNext() {\n if (this.numRunning_ >= this.maxConcurrent_) return;\n const promise = this.pending_.shift();\n if (promise === undefined) return;\n this.numRunning_++;\n promise();\n }\n\n get abortSignal() {\n return this.abortController_.signal;\n }\n\n shutdown() {\n this.abortController_.abort(new AbortError(\"shutdown\"));\n }\n\n get numRunning() {\n return this.numRunning_;\n }\n\n get numPending() {\n return this.pending_.length;\n }\n}\n","import { Full, Interval, Region } from \"../data/region\";\nimport { Chunk, ChunkLoader, ChunkSource } from \"../data/chunk\";\nimport { AbortError, PromiseScheduler } from \"../data/promise_scheduler\";\nimport { Logger } from \"../utilities/logger\";\n\ntype SeriesAttributes = {\n start: number;\n stop: number;\n scale: number;\n length: number;\n};\n\ntype LoadingToken = {\n canceled: boolean;\n index: number;\n};\n\nexport type SetIndexResult = {\n success: boolean;\n reason?: \"duplicate\" | \"canceled\";\n chunk?: Chunk;\n};\n\ntype ImageSeriesLoaderProps = {\n source: ChunkSource;\n region: Region;\n seriesDimensionName: string;\n lod?: number;\n};\n\nexport class ImageSeriesLoader {\n private readonly source_: ChunkSource;\n private readonly region_: Region;\n private readonly seriesDimensionName_: string;\n private readonly seriesIndex_: Interval | Full;\n private readonly scheduler_: PromiseScheduler = new PromiseScheduler(16);\n private readonly lod_?: number;\n private loader_: ChunkLoader | null = null;\n private seriesAttributes_?: SeriesAttributes;\n private loadingToken_: LoadingToken | null = null;\n public dataChunks_: Chunk[] = [];\n\n constructor(props: ImageSeriesLoaderProps) {\n this.source_ = props.source;\n this.region_ = props.region;\n this.lod_ = props.lod;\n this.seriesDimensionName_ = props.seriesDimensionName;\n const seriesDimensionalIndex = props.region.find(\n (x) => x.dimension == props.seriesDimensionName\n );\n if (seriesDimensionalIndex === undefined) {\n throw new Error(\n `Series dimension '${props.seriesDimensionName}' not in region ${JSON.stringify(props.region)}`\n );\n }\n if (seriesDimensionalIndex.index.type === \"point\") {\n throw new Error(\n \"Series dimension index in region must be an interval or 'full', not a point value\"\n );\n }\n this.seriesIndex_ = seriesDimensionalIndex.index;\n }\n\n public async setPosition(position: number): Promise<SetIndexResult> {\n const seriesAttributes = await this.loadSeriesAttributes();\n const index = Math.round(\n (position - seriesAttributes.start) / seriesAttributes.scale\n );\n return await this.setIndex(index);\n }\n\n public async setIndex(index: number): Promise<SetIndexResult> {\n const token = this.loadingToken_;\n if (token) {\n if (token.index === index && !token.canceled) {\n Logger.debug(\n \"ImageSeriesLoader\",\n \"Ignoring duplicate active setIndex request\"\n );\n return { success: false, reason: \"duplicate\" };\n } else {\n Logger.debug(\n \"ImageSeriesLoader\",\n `Cancelling setIndex request for index ${token.index}, new requested index is ${index}`\n );\n token.canceled = true;\n }\n }\n let chunk = this.dataChunks_[index];\n if (chunk === undefined) {\n const newToken = { canceled: false, index: index };\n this.loadingToken_ = newToken;\n chunk = await this.loadChunkAtIndex(index, newToken);\n if (newToken.canceled) return { success: false, reason: \"canceled\" };\n }\n return { success: true, chunk };\n }\n\n public shutdown() {\n this.scheduler_.shutdown();\n }\n\n public async loadSeriesAttributes() {\n if (this.seriesAttributes_) {\n return this.seriesAttributes_;\n }\n const loader = await this.getLoader();\n const dimensions = loader.getSourceDimensionMap();\n const lod = this.lod_ ?? dimensions.numLods - 1;\n\n const allDimensions = [\n dimensions.x,\n dimensions.y,\n dimensions.z,\n dimensions.c,\n dimensions.t,\n ].filter((d) => d !== undefined);\n const seriesDimension = allDimensions.find(\n (d) => d.name === this.seriesDimensionName_\n );\n if (!seriesDimension) {\n const availableDims = allDimensions.map((d) => d.name).join(\", \");\n throw new Error(\n `Series dimension \"${this.seriesDimensionName_}\" not found in loader dimensions: ${availableDims}`\n );\n }\n const seriesDimScale = seriesDimension.lods[lod].scale;\n const seriesMax = seriesDimension.lods[lod].size * seriesDimScale;\n\n const indexIsFull = this.seriesIndex_.type === \"full\";\n const seriesStart = indexIsFull ? 0 : this.seriesIndex_.start;\n const seriesStop = indexIsFull ? seriesMax : this.seriesIndex_.stop;\n\n const seriesLength = Math.round(\n (seriesStop - seriesStart) / seriesDimScale\n );\n this.dataChunks_ = new Array(seriesLength);\n\n this.seriesAttributes_ = {\n start: seriesStart,\n stop: seriesStop,\n scale: seriesDimScale,\n length: seriesLength,\n };\n return this.seriesAttributes_;\n }\n\n public async loadChunkAtIndex(index: number, token?: LoadingToken) {\n const seriesAttributes = await this.loadSeriesAttributes();\n if (index < 0 || index >= seriesAttributes.length) {\n throw new Error(\n `Requested index ${index} is out of bounds [0, ${seriesAttributes.length - 1}]`\n );\n }\n\n // replace the series region with a point region for the requested index\n const position = seriesAttributes.start + index * seriesAttributes.scale;\n const pointRegion = this.region_.filter(\n (dimIndex) => dimIndex.dimension !== this.seriesDimensionName_\n );\n pointRegion.push({\n dimension: this.seriesDimensionName_,\n index: { type: \"point\", value: position },\n });\n\n const loader = await this.getLoader();\n const lod = this.lod_ ?? loader.getSourceDimensionMap().numLods - 1;\n\n const chunk = await loader.loadRegion(pointRegion, lod, this.scheduler_);\n this.dataChunks_[index] = chunk;\n\n if (token && token.canceled) {\n this.loadingToken_ = null;\n }\n return chunk;\n }\n\n public async preloadAllChunks() {\n const { length } = await this.loadSeriesAttributes();\n // Load remaining slices concurrently, exclude the token so they don't get set\n const loadPromises = [];\n for (let index = 0; index < length; index++) {\n loadPromises.push(this.loadChunkAtIndex(index));\n }\n\n // Wait for all slices to finish loading\n const results = await Promise.allSettled(loadPromises);\n for (const result of results) {\n if (result.status === \"rejected\") {\n if (result.reason instanceof AbortError) {\n // reject the promise because this means the layer was closed\n return Promise.reject(result.reason);\n } else {\n Logger.error(\n \"ImageSeriesLoader\",\n `Error loading slice: ${result.reason}`\n );\n }\n }\n }\n }\n\n private async getLoader() {\n this.loader_ ??= await this.source_.open();\n return this.loader_;\n }\n}\n","import { Layer, LayerOptions } from \"../core/layer\";\nimport { Region } from \"../data/region\";\nimport { Chunk, ChunkSource } from \"../data/chunk\";\nimport { Texture2DArray } from \"../objects/textures/texture_2d_array\";\nimport { ChannelProps, ChannelsEnabled } from \"../objects/textures/channel\";\nimport { ImageRenderable } from \"../objects/renderable/image_renderable\";\nimport { ImageSeriesLoader, SetIndexResult } from \"./image_series_loader\";\n\nexport type ImageSeriesLayerProps = LayerOptions & {\n source: ChunkSource;\n region: Region;\n seriesDimensionName: string;\n channelProps?: ChannelProps[];\n lod?: number;\n};\n\nexport class ImageSeriesLayer extends Layer implements ChannelsEnabled {\n public readonly type = \"ImageSeriesLayer\";\n private readonly seriesLoader_: ImageSeriesLoader;\n private readonly initialChannelProps_?: ChannelProps[];\n private readonly channelChangeCallbacks_: Array<() => void> = [];\n private channelProps_?: ChannelProps[];\n private texture_: Texture2DArray | null = null;\n private image_?: ImageRenderable;\n private extent_?: { x: number; y: number };\n\n constructor({\n source,\n region,\n seriesDimensionName,\n channelProps,\n lod,\n ...layerOptions\n }: ImageSeriesLayerProps) {\n super(layerOptions);\n this.setState(\"initialized\");\n this.channelProps_ = channelProps;\n this.initialChannelProps_ = channelProps;\n this.seriesLoader_ = new ImageSeriesLoader({\n source,\n region,\n seriesDimensionName,\n lod,\n });\n }\n\n public update() {\n if (this.state === \"initialized\") {\n this.setState(\"loading\");\n this.seriesLoader_.loadSeriesAttributes();\n }\n }\n\n public get channelProps(): ChannelProps[] | undefined {\n return this.channelProps_;\n }\n\n public setChannelProps(channelProps: ChannelProps[]) {\n this.channelProps_ = channelProps;\n this.image_?.setChannelProps(channelProps);\n this.channelChangeCallbacks_.forEach((callback) => {\n callback();\n });\n }\n\n public resetChannelProps(): void {\n if (this.initialChannelProps_ !== undefined) {\n this.setChannelProps(this.initialChannelProps_);\n }\n }\n\n public addChannelChangeCallback(callback: () => void): void {\n this.channelChangeCallbacks_.push(callback);\n }\n\n public removeChannelChangeCallback(callback: () => void): void {\n const index = this.channelChangeCallbacks_.indexOf(callback);\n if (index === undefined) {\n throw new Error(`Callback to remove could not be found: ${callback}`);\n }\n this.channelChangeCallbacks_.splice(index, 1);\n }\n\n public async setPosition(position: number): Promise<SetIndexResult> {\n const result = await this.seriesLoader_.setPosition(position);\n return this.processIndexResult(result);\n }\n\n public async setIndex(index: number): Promise<SetIndexResult> {\n const result = await this.seriesLoader_.setIndex(index);\n return this.processIndexResult(result);\n }\n\n public close() {\n this.seriesLoader_.shutdown();\n }\n\n public async preloadSeries() {\n return this.seriesLoader_.preloadAllChunks();\n }\n\n public get extent(): { x: number; y: number } | undefined {\n return this.extent_;\n }\n\n private processIndexResult(result: SetIndexResult) {\n if (result.chunk) {\n this.setData(result.chunk);\n this.setState(\"ready\");\n }\n return result;\n }\n\n private setData(chunk: Chunk) {\n if (!this.texture_ || !this.image_) {\n this.texture_ = Texture2DArray.createWithChunk(chunk);\n this.image_ = this.createImage(chunk, this.texture_, this.channelProps_);\n this.addObject(this.image_);\n\n // extent does not change after renderable creation\n this.extent_ = {\n x: chunk.shape.x * chunk.scale.x,\n y: chunk.shape.y * chunk.scale.y,\n };\n } else if (chunk.data) {\n this.texture_.updateWithChunk(chunk);\n }\n }\n\n private createImage(\n chunk: Chunk,\n texture: Texture2DArray,\n channelProps?: ChannelProps[]\n ) {\n const image = new ImageRenderable(\n chunk.shape.x,\n chunk.shape.y,\n texture,\n channelProps\n );\n image.transform.setScale([chunk.scale.x, chunk.scale.y, 1]);\n image.transform.setTranslation([chunk.offset.x, chunk.offset.y, 0]);\n return image;\n }\n}\n","export class NodeNotFoundError extends Error {\n constructor(context, options = {}) {\n super(`Node not found: ${context}`, options);\n this.name = \"NodeNotFoundError\";\n }\n}\nexport class KeyError extends Error {\n constructor(path) {\n super(`Missing key: ${path}`);\n this.name = \"KeyError\";\n }\n}\n","/**\n * A codec for bit-rounding.\n *\n * Reduces floating-point precision by truncating mantissa bits during encoding.\n * Decoding is a no-op as the process is lossy and precision cannot be restored.\n *\n * Note: {@link BitroundCodec.encode} is not yet implemented since Zarrita is\n * primarily used in read-only contexts (web browser). If you need encoding support,\n * please open an issue at {@link https://github.com/manzt/zarrita.js/issues}.\n *\n * @see {@link https://github.com/zarr-developers/numcodecs/blob/main/numcodecs/bitround.py}\n * for the original Python implementation.\n *\n * @remarks\n * Data types are not validated, and `float16` arrays are not supported (reflecting browser support).\n */\nexport class BitroundCodec {\n kind = \"array_to_array\";\n constructor(configuration, _meta) {\n if (configuration.keepbits < 0) {\n throw new Error(\"keepbits must be zero or positive\");\n }\n }\n static fromConfig(configuration, meta) {\n return new BitroundCodec(configuration, meta);\n }\n /**\n * Encode a chunk of data with bit-rounding.\n * @param _arr - The chunk to encode\n */\n encode(_arr) {\n throw new Error(\"`BitroundCodec.encode` is not implemented. Please open an issue at https://github.com/manzt/zarrita.js/issues.\");\n }\n /**\n * Decode a chunk of data (no-op).\n * @param arr - The chunk to decode\n * @returns The decoded chunk\n */\n decode(arr) {\n return arr; // No-op as bit-rounding is lossy\n }\n}\n","export class BoolArray {\n #bytes;\n constructor(x, byteOffset, length) {\n if (typeof x === \"number\") {\n this.#bytes = new Uint8Array(x);\n }\n else if (x instanceof ArrayBuffer) {\n this.#bytes = new Uint8Array(x, byteOffset, length);\n }\n else {\n this.#bytes = new Uint8Array(Array.from(x, (v) => (v ? 1 : 0)));\n }\n }\n get BYTES_PER_ELEMENT() {\n return 1;\n }\n get byteOffset() {\n return this.#bytes.byteOffset;\n }\n get byteLength() {\n return this.#bytes.byteLength;\n }\n get buffer() {\n return this.#bytes.buffer;\n }\n get length() {\n return this.#bytes.length;\n }\n get(idx) {\n let value = this.#bytes[idx];\n return typeof value === \"number\" ? value !== 0 : value;\n }\n set(idx, value) {\n this.#bytes[idx] = value ? 1 : 0;\n }\n fill(value) {\n this.#bytes.fill(value ? 1 : 0);\n }\n *[Symbol.iterator]() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n}\nexport class ByteStringArray {\n _data;\n chars;\n #encoder;\n constructor(chars, x, byteOffset, length) {\n this.chars = chars;\n this.#encoder = new TextEncoder();\n if (typeof x === \"number\") {\n this._data = new Uint8Array(x * chars);\n }\n else if (x instanceof ArrayBuffer) {\n if (length)\n length = length * chars;\n this._data = new Uint8Array(x, byteOffset, length);\n }\n else {\n let values = Array.from(x);\n this._data = new Uint8Array(values.length * chars);\n for (let i = 0; i < values.length; i++) {\n this.set(i, values[i]);\n }\n }\n }\n get BYTES_PER_ELEMENT() {\n return this.chars;\n }\n get byteOffset() {\n return this._data.byteOffset;\n }\n get byteLength() {\n return this._data.byteLength;\n }\n get buffer() {\n return this._data.buffer;\n }\n get length() {\n return this.byteLength / this.BYTES_PER_ELEMENT;\n }\n get(idx) {\n const view = new Uint8Array(this.buffer, this.byteOffset + this.chars * idx, this.chars);\n // biome-ignore lint/suspicious/noControlCharactersInRegex: necessary for null byte removal\n return new TextDecoder().decode(view).replace(/\\x00/g, \"\");\n }\n set(idx, value) {\n const view = new Uint8Array(this.buffer, this.byteOffset + this.chars * idx, this.chars);\n view.fill(0); // clear current\n view.set(this.#encoder.encode(value));\n }\n fill(value) {\n const encoded = this.#encoder.encode(value);\n for (let i = 0; i < this.length; i++) {\n this._data.set(encoded, i * this.chars);\n }\n }\n *[Symbol.iterator]() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n}\nexport class UnicodeStringArray {\n #data;\n chars;\n constructor(chars, x, byteOffset, length) {\n this.chars = chars;\n if (typeof x === \"number\") {\n this.#data = new Int32Array(x * chars);\n }\n else if (x instanceof ArrayBuffer) {\n if (length)\n length *= chars;\n this.#data = new Int32Array(x, byteOffset, length);\n }\n else {\n const values = x;\n const d = new UnicodeStringArray(chars, 1);\n this.#data = new Int32Array((function* () {\n for (let str of values) {\n d.set(0, str);\n yield* d.#data;\n }\n })());\n }\n }\n get BYTES_PER_ELEMENT() {\n return this.#data.BYTES_PER_ELEMENT * this.chars;\n }\n get byteLength() {\n return this.#data.byteLength;\n }\n get byteOffset() {\n return this.#data.byteOffset;\n }\n get buffer() {\n return this.#data.buffer;\n }\n get length() {\n return this.#data.length / this.chars;\n }\n get(idx) {\n const offset = this.chars * idx;\n let result = \"\";\n for (let i = 0; i < this.chars; i++) {\n result += String.fromCodePoint(this.#data[offset + i]);\n }\n // biome-ignore lint/suspicious/noControlCharactersInRegex: necessary for null byte removal\n return result.replace(/\\u0000/g, \"\");\n }\n set(idx, value) {\n const offset = this.chars * idx;\n const view = this.#data.subarray(offset, offset + this.chars);\n view.fill(0); // clear current\n for (let i = 0; i < this.chars; i++) {\n view[i] = value.codePointAt(i) ?? 0;\n }\n }\n fill(value) {\n // encode once\n this.set(0, value);\n // copy the encoded values to all other elements\n let encoded = this.#data.subarray(0, this.chars);\n for (let i = 1; i < this.length; i++) {\n this.#data.set(encoded, i * this.chars);\n }\n }\n *[Symbol.iterator]() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n}\n","import { BoolArray, ByteStringArray, UnicodeStringArray, } from \"@zarrita/typedarray\";\nexport function json_encode_object(o) {\n const str = JSON.stringify(o, null, 2);\n return new TextEncoder().encode(str);\n}\nexport function json_decode_object(bytes) {\n const str = new TextDecoder().decode(bytes);\n return JSON.parse(str);\n}\nexport function byteswap_inplace(view, bytes_per_element) {\n const numFlips = bytes_per_element / 2;\n const endByteIndex = bytes_per_element - 1;\n let t = 0;\n for (let i = 0; i < view.length; i += bytes_per_element) {\n for (let j = 0; j < numFlips; j += 1) {\n t = view[i + j];\n view[i + j] = view[i + endByteIndex - j];\n view[i + endByteIndex - j] = t;\n }\n }\n}\nconst CONSTRUCTORS = {\n int8: Int8Array,\n int16: Int16Array,\n int32: Int32Array,\n int64: globalThis.BigInt64Array,\n uint8: Uint8Array,\n uint16: Uint16Array,\n uint32: Uint32Array,\n uint64: globalThis.BigUint64Array,\n float32: Float32Array,\n float64: Float64Array,\n bool: BoolArray,\n};\nconst V2_STRING_REGEX = /v2:([US])(\\d+)/;\nexport function get_ctr(data_type) {\n if (data_type === \"v2:object\") {\n return globalThis.Array;\n }\n let match = data_type.match(V2_STRING_REGEX);\n if (match) {\n let [, kind, chars] = match;\n // @ts-expect-error\n return (kind === \"U\" ? UnicodeStringArray : ByteStringArray).bind(null, Number(chars));\n }\n // @ts-expect-error - We've checked that the key exists\n let ctr = CONSTRUCTORS[data_type];\n if (!ctr) {\n throw new Error(`Unknown or unsupported data_type: ${data_type}`);\n }\n return ctr;\n}\n/** Compute strides for 'C' or 'F' ordered array from shape */\nexport function get_strides(shape, order) {\n return (order === \"C\" ? row_major_stride : col_major_stride)(shape);\n}\nfunction row_major_stride(shape) {\n const ndim = shape.length;\n const stride = globalThis.Array(ndim);\n for (let i = ndim - 1, step = 1; i >= 0; i--) {\n stride[i] = step;\n step *= shape[i];\n }\n return stride;\n}\nfunction col_major_stride(shape) {\n const ndim = shape.length;\n const stride = globalThis.Array(ndim);\n for (let i = 0, step = 1; i < ndim; i++) {\n stride[i] = step;\n step *= shape[i];\n }\n return stride;\n}\n// https://zarr-specs.readthedocs.io/en/latest/v3/core/v3.0.html#chunk-key-encoding\nexport function create_chunk_key_encoder({ name, configuration, }) {\n if (name === \"default\") {\n const separator = configuration?.separator ?? \"/\";\n return (chunk_coords) => [\"c\", ...chunk_coords].join(separator);\n }\n if (name === \"v2\") {\n const separator = configuration?.separator ?? \".\";\n return (chunk_coords) => chunk_coords.join(separator) || \"0\";\n }\n throw new Error(`Unknown chunk key encoding: ${name}`);\n}\nexport function get_array_order(codecs) {\n const maybe_transpose_codec = codecs.find((c) => c.name === \"transpose\");\n return maybe_transpose_codec?.configuration?.order === \"F\" ? \"F\" : \"C\";\n}\nconst endian_regex = /^([<|>])(.*)$/;\nfunction coerce_dtype(dtype) {\n if (dtype === \"|O\") {\n return { data_type: \"v2:object\" };\n }\n let match = dtype.match(endian_regex);\n if (!match) {\n throw new Error(`Invalid dtype: ${dtype}`);\n }\n let [, endian, rest] = match;\n let data_type = {\n b1: \"bool\",\n i1: \"int8\",\n u1: \"uint8\",\n i2: \"int16\",\n u2: \"uint16\",\n i4: \"int32\",\n u4: \"uint32\",\n i8: \"int64\",\n u8: \"uint64\",\n f4: \"float32\",\n f8: \"float64\",\n }[rest] ??\n (rest.startsWith(\"S\") || rest.startsWith(\"U\") ? `v2:${rest}` : undefined);\n if (!data_type) {\n throw new Error(`Unsupported or unknown dtype: ${dtype}`);\n }\n if (endian === \"|\") {\n return { data_type };\n }\n return { data_type, endian: endian === \"<\" ? \"little\" : \"big\" };\n}\nexport function v2_to_v3_array_metadata(meta, attributes = {}) {\n let codecs = [];\n let dtype = coerce_dtype(meta.dtype);\n if (meta.order === \"F\") {\n codecs.push({ name: \"transpose\", configuration: { order: \"F\" } });\n }\n if (\"endian\" in dtype && dtype.endian === \"big\") {\n codecs.push({ name: \"bytes\", configuration: { endian: \"big\" } });\n }\n for (let { id, ...configuration } of meta.filters ?? []) {\n codecs.push({ name: id, configuration });\n }\n if (meta.compressor) {\n let { id, ...configuration } = meta.compressor;\n codecs.push({ name: id, configuration });\n }\n return {\n zarr_format: 3,\n node_type: \"array\",\n shape: meta.shape,\n data_type: dtype.data_type,\n chunk_grid: {\n name: \"regular\",\n configuration: {\n chunk_shape: meta.chunks,\n },\n },\n chunk_key_encoding: {\n name: \"v2\",\n configuration: {\n separator: meta.dimension_separator ?? \".\",\n },\n },\n codecs,\n fill_value: meta.fill_value,\n attributes,\n };\n}\nexport function v2_to_v3_group_metadata(_meta, attributes = {}) {\n return {\n zarr_format: 3,\n node_type: \"group\",\n attributes,\n };\n}\nexport function is_dtype(dtype, query) {\n if (query !== \"number\" &&\n query !== \"bigint\" &&\n query !== \"boolean\" &&\n query !== \"object\" &&\n query !== \"string\") {\n return dtype === query;\n }\n let is_boolean = dtype === \"bool\";\n if (query === \"boolean\")\n return is_boolean;\n let is_string = dtype.startsWith(\"v2:U\") || dtype.startsWith(\"v2:S\");\n if (query === \"string\")\n return is_string;\n let is_bigint = dtype === \"int64\" || dtype === \"uint64\";\n if (query === \"bigint\")\n return is_bigint;\n let is_object = dtype === \"v2:object\";\n if (query === \"object\")\n return is_object;\n return !is_string && !is_bigint && !is_boolean && !is_object;\n}\nexport function is_sharding_codec(codec) {\n return codec?.name === \"sharding_indexed\";\n}\nexport function ensure_correct_scalar(metadata) {\n if ((metadata.data_type === \"uint64\" || metadata.data_type === \"int64\") &&\n metadata.fill_value != null) {\n // @ts-expect-error - We've narrowed the type of fill_value correctly\n return BigInt(metadata.fill_value);\n }\n return metadata.fill_value;\n}\n","import { byteswap_inplace, get_array_order, get_ctr, get_strides, } from \"../util.js\";\nconst LITTLE_ENDIAN_OS = system_is_little_endian();\nfunction system_is_little_endian() {\n const a = new Uint32Array([0x12345678]);\n const b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return !(b[0] === 0x12);\n}\nfunction bytes_per_element(TypedArray) {\n if (\"BYTES_PER_ELEMENT\" in TypedArray) {\n return TypedArray.BYTES_PER_ELEMENT;\n }\n // Unicode string array is backed by a Int32Array.\n return 4;\n}\nexport class BytesCodec {\n kind = \"array_to_bytes\";\n #strides;\n #TypedArray;\n #BYTES_PER_ELEMENT;\n #shape;\n #endian;\n constructor(configuration, meta) {\n this.#endian = configuration?.endian;\n this.#TypedArray = get_ctr(meta.data_type);\n this.#shape = meta.shape;\n this.#strides = get_strides(meta.shape, get_array_order(meta.codecs));\n // TODO: fix me.\n // hack to get bytes per element since it's dynamic for string types.\n const sample = new this.#TypedArray(0);\n this.#BYTES_PER_ELEMENT = sample.BYTES_PER_ELEMENT;\n }\n static fromConfig(configuration, meta) {\n return new BytesCodec(configuration, meta);\n }\n encode(arr) {\n let bytes = new Uint8Array(arr.data.buffer);\n if (LITTLE_ENDIAN_OS && this.#endian === \"big\") {\n byteswap_inplace(bytes, bytes_per_element(this.#TypedArray));\n }\n return bytes;\n }\n decode(bytes) {\n if (LITTLE_ENDIAN_OS && this.#endian === \"big\") {\n byteswap_inplace(bytes, bytes_per_element(this.#TypedArray));\n }\n return {\n data: new this.#TypedArray(bytes.buffer, bytes.byteOffset, bytes.byteLength / this.#BYTES_PER_ELEMENT),\n shape: this.#shape,\n stride: this.#strides,\n };\n }\n}\n","export class Crc32cCodec {\n kind = \"bytes_to_bytes\";\n static fromConfig() {\n return new Crc32cCodec();\n }\n encode(_) {\n throw new Error(\"Not implemented\");\n }\n decode(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength - 4);\n }\n}\n","import { get_strides, json_decode_object } from \"../util.js\";\n// Reference: https://stackoverflow.com/a/21897413\nfunction throw_on_nan_replacer(_key, value) {\n if (Number.isNaN(value)) {\n throw new Error(\"JsonCodec allow_nan is false but NaN was encountered during encoding.\");\n }\n if (value === Number.POSITIVE_INFINITY) {\n throw new Error(\"JsonCodec allow_nan is false but Infinity was encountered during encoding.\");\n }\n if (value === Number.NEGATIVE_INFINITY) {\n throw new Error(\"JsonCodec allow_nan is false but -Infinity was encountered during encoding.\");\n }\n return value;\n}\n// Reference: https://gist.github.com/davidfurlong/463a83a33b70a3b6618e97ec9679e490\nfunction sort_keys_replacer(_key, value) {\n return value instanceof Object && !Array.isArray(value)\n ? Object.keys(value)\n .sort()\n .reduce((sorted, key) => {\n sorted[key] = value[key];\n return sorted;\n }, {})\n : value;\n}\nexport class JsonCodec {\n configuration;\n kind = \"array_to_bytes\";\n #encoder_config;\n #decoder_config;\n constructor(configuration = {}) {\n this.configuration = configuration;\n // Reference: https://github.com/zarr-developers/numcodecs/blob/0878717a3613d91a453fe3d3716aa9c67c023a8b/numcodecs/json.py#L36\n const { encoding = \"utf-8\", skipkeys = false, ensure_ascii = true, check_circular = true, allow_nan = true, sort_keys = true, indent, strict = true, } = configuration;\n let separators = configuration.separators;\n if (!separators) {\n // ensure separators are explicitly specified, and consistent behaviour across\n // Python versions, and most compact representation if indent is None\n if (!indent) {\n separators = [\",\", \":\"];\n }\n else {\n separators = [\", \", \": \"];\n }\n }\n this.#encoder_config = {\n encoding,\n skipkeys,\n ensure_ascii,\n check_circular,\n allow_nan,\n indent,\n separators,\n sort_keys,\n };\n this.#decoder_config = { strict };\n }\n static fromConfig(configuration) {\n return new JsonCodec(configuration);\n }\n encode(buf) {\n const { indent, encoding, ensure_ascii, check_circular, allow_nan, sort_keys, } = this.#encoder_config;\n if (encoding !== \"utf-8\") {\n throw new Error(\"JsonCodec does not yet support non-utf-8 encoding.\");\n }\n const replacer_functions = [];\n if (!check_circular) {\n // By default, for JSON.stringify,\n // a TypeError will be thrown if one attempts to encode an object with circular references\n throw new Error(\"JsonCodec does not yet support skipping the check for circular references during encoding.\");\n }\n if (!allow_nan) {\n // Throw if NaN/Infinity/-Infinity are encountered during encoding.\n replacer_functions.push(throw_on_nan_replacer);\n }\n if (sort_keys) {\n // We can ensure keys are sorted but not really the opposite since\n // there is no guarantee of key ordering in JS.\n replacer_functions.push(sort_keys_replacer);\n }\n const items = Array.from(buf.data);\n items.push(\"|O\");\n items.push(buf.shape);\n let replacer = undefined;\n if (replacer_functions.length) {\n replacer = (key, value) => {\n let new_value = value;\n for (let sub_replacer of replacer_functions) {\n new_value = sub_replacer(key, new_value);\n }\n return new_value;\n };\n }\n let json_str = JSON.stringify(items, replacer, indent);\n if (ensure_ascii) {\n // If ensure_ascii is true (the default), the output is guaranteed\n // to have all incoming non-ASCII characters escaped.\n // If ensure_ascii is false, these characters will be output as-is.\n // Reference: https://stackoverflow.com/a/31652607\n json_str = json_str.replace(/[\\u007F-\\uFFFF]/g, (chr) => {\n const full_str = `0000${chr.charCodeAt(0).toString(16)}`;\n const sub_str = full_str.substring(full_str.length - 4);\n return `\\\\u${sub_str}`;\n });\n }\n return new TextEncoder().encode(json_str);\n }\n decode(bytes) {\n const { strict } = this.#decoder_config;\n if (!strict) {\n // (i.e., allowing control characters inside strings)\n throw new Error(\"JsonCodec does not yet support non-strict decoding.\");\n }\n const items = json_decode_object(bytes);\n const shape = items.pop();\n items.pop(); // Pop off dtype (unused)\n if (!shape) {\n // O-d case\n throw new Error(\"0D not implemented for JsonCodec.\");\n }\n const stride = get_strides(shape, \"C\");\n const data = items;\n return { data, shape, stride };\n }\n}\n","import { BoolArray, ByteStringArray, UnicodeStringArray, } from \"@zarrita/typedarray\";\nimport { get_strides } from \"../util.js\";\nfunction proxy(arr) {\n if (arr instanceof BoolArray ||\n arr instanceof ByteStringArray ||\n arr instanceof UnicodeStringArray) {\n // @ts-expect-error - TS cannot infer arr is a TypedArrayProxy<D>\n const arrp = new Proxy(arr, {\n get(target, prop) {\n return target.get(Number(prop));\n },\n set(target, prop, value) {\n // @ts-expect-error - value is OK\n target.set(Number(prop), value);\n return true;\n },\n });\n return arrp;\n }\n // @ts-expect-error - TS cannot infer arr is a TypedArrayProxy<D>\n return arr;\n}\nfunction empty_like(chunk, order) {\n let data;\n if (chunk.data instanceof ByteStringArray ||\n chunk.data instanceof UnicodeStringArray) {\n data = new chunk.constructor(\n // @ts-expect-error\n chunk.data.length, chunk.data.chars);\n }\n else {\n data = new chunk.constructor(chunk.data.length);\n }\n return {\n data,\n shape: chunk.shape,\n stride: get_strides(chunk.shape, order),\n };\n}\nfunction convert_array_order(src, target) {\n let out = empty_like(src, target);\n let n_dims = src.shape.length;\n let size = src.data.length;\n let index = Array(n_dims).fill(0);\n let src_data = proxy(src.data);\n let out_data = proxy(out.data);\n for (let src_idx = 0; src_idx < size; src_idx++) {\n let out_idx = 0;\n for (let dim = 0; dim < n_dims; dim++) {\n out_idx += index[dim] * out.stride[dim];\n }\n out_data[out_idx] = src_data[src_idx];\n index[0] += 1;\n for (let dim = 0; dim < n_dims; dim++) {\n if (index[dim] === src.shape[dim]) {\n if (dim + 1 === n_dims) {\n break;\n }\n index[dim] = 0;\n index[dim + 1] += 1;\n }\n }\n }\n return out;\n}\nfunction get_order(arr) {\n // Assume C order if no stride is given\n if (!arr.stride)\n return \"C\";\n let row_major_strides = get_strides(arr.shape, \"C\");\n return arr.stride.every((s, i) => s === row_major_strides[i]) ? \"C\" : \"F\";\n}\nexport class TransposeCodec {\n configuration;\n kind = \"array_to_array\";\n constructor(configuration) {\n this.configuration = configuration;\n }\n static fromConfig(configuration) {\n return new TransposeCodec(configuration);\n }\n encode(arr) {\n if (get_order(arr) === this.configuration?.order) {\n return arr;\n }\n return convert_array_order(arr, this.configuration?.order ?? \"C\");\n }\n decode(arr) {\n return arr;\n }\n}\n","import { get_strides } from \"../util.js\";\nexport class VLenUTF8 {\n kind = \"array_to_bytes\";\n #shape;\n #strides;\n constructor(shape) {\n this.#shape = shape;\n this.#strides = get_strides(shape, \"C\");\n }\n static fromConfig(_, meta) {\n return new VLenUTF8(meta.shape);\n }\n encode(_chunk) {\n throw new Error(\"Method not implemented.\");\n }\n decode(bytes) {\n let decoder = new TextDecoder();\n let view = new DataView(bytes.buffer);\n let data = Array(view.getUint32(0, true));\n let pos = 4;\n for (let i = 0; i < data.length; i++) {\n let item_length = view.getUint32(pos, true);\n pos += 4;\n data[i] = decoder.decode(bytes.buffer.slice(pos, pos + item_length));\n pos += item_length;\n }\n return { data, shape: this.#shape, stride: this.#strides };\n }\n}\n","import { BitroundCodec } from \"./codecs/bitround.js\";\nimport { BytesCodec } from \"./codecs/bytes.js\";\nimport { Crc32cCodec } from \"./codecs/crc32c.js\";\nimport { JsonCodec } from \"./codecs/json2.js\";\nimport { TransposeCodec } from \"./codecs/transpose.js\";\nimport { VLenUTF8 } from \"./codecs/vlen-utf8.js\";\nfunction create_default_registry() {\n return new Map()\n .set(\"blosc\", () => import(\"numcodecs/blosc\").then((m) => m.default))\n .set(\"gzip\", () => import(\"numcodecs/gzip\").then((m) => m.default))\n .set(\"lz4\", () => import(\"numcodecs/lz4\").then((m) => m.default))\n .set(\"zlib\", () => import(\"numcodecs/zlib\").then((m) => m.default))\n .set(\"zstd\", () => import(\"numcodecs/zstd\").then((m) => m.default))\n .set(\"transpose\", () => TransposeCodec)\n .set(\"bytes\", () => BytesCodec)\n .set(\"crc32c\", () => Crc32cCodec)\n .set(\"vlen-utf8\", () => VLenUTF8)\n .set(\"json2\", () => JsonCodec)\n .set(\"bitround\", () => BitroundCodec);\n}\nexport const registry = create_default_registry();\nexport function create_codec_pipeline(chunk_metadata) {\n let codecs;\n return {\n async encode(chunk) {\n if (!codecs)\n codecs = await load_codecs(chunk_metadata);\n for (const codec of codecs.array_to_array) {\n chunk = await codec.encode(chunk);\n }\n let bytes = await codecs.array_to_bytes.encode(chunk);\n for (const codec of codecs.bytes_to_bytes) {\n bytes = await codec.encode(bytes);\n }\n return bytes;\n },\n async decode(bytes) {\n if (!codecs)\n codecs = await load_codecs(chunk_metadata);\n for (let i = codecs.bytes_to_bytes.length - 1; i >= 0; i--) {\n bytes = await codecs.bytes_to_bytes[i].decode(bytes);\n }\n let chunk = await codecs.array_to_bytes.decode(bytes);\n for (let i = codecs.array_to_array.length - 1; i >= 0; i--) {\n chunk = await codecs.array_to_array[i].decode(chunk);\n }\n return chunk;\n },\n };\n}\nasync function load_codecs(chunk_meta) {\n let promises = chunk_meta.codecs.map(async (meta) => {\n let Codec = await registry.get(meta.name)?.();\n if (!Codec) {\n throw new Error(`Unknown codec: ${meta.name}`);\n }\n return { Codec, meta };\n });\n let array_to_array = [];\n let array_to_bytes;\n let bytes_to_bytes = [];\n for await (let { Codec, meta } of promises) {\n let codec = Codec.fromConfig(meta.configuration, chunk_meta);\n switch (codec.kind) {\n case \"array_to_array\":\n array_to_array.push(codec);\n break;\n case \"array_to_bytes\":\n array_to_bytes = codec;\n break;\n default:\n bytes_to_bytes.push(codec);\n }\n }\n if (!array_to_bytes) {\n if (!is_typed_array_like_meta(chunk_meta)) {\n throw new Error(`Cannot encode ${chunk_meta.data_type} to bytes without a codec`);\n }\n array_to_bytes = BytesCodec.fromConfig({ endian: \"little\" }, chunk_meta);\n }\n return { array_to_array, array_to_bytes, bytes_to_bytes };\n}\nfunction is_typed_array_like_meta(meta) {\n return meta.data_type !== \"v2:object\";\n}\n","import { create_codec_pipeline } from \"../codecs.js\";\nconst MAX_BIG_UINT = 18446744073709551615n;\nexport function create_sharded_chunk_getter(location, shard_shape, encode_shard_key, sharding_config) {\n if (location.store.getRange === undefined) {\n throw new Error(\"Store does not support range requests\");\n }\n let get_range = location.store.getRange.bind(location.store);\n let index_shape = shard_shape.map((d, i) => d / sharding_config.chunk_shape[i]);\n let index_codec = create_codec_pipeline({\n data_type: \"uint64\",\n shape: [...index_shape, 2],\n codecs: sharding_config.index_codecs,\n });\n let cache = {};\n return async (chunk_coord) => {\n let shard_coord = chunk_coord.map((d, i) => Math.floor(d / index_shape[i]));\n let shard_path = location.resolve(encode_shard_key(shard_coord)).path;\n let index;\n if (shard_path in cache) {\n index = cache[shard_path];\n }\n else {\n let checksum_size = 4;\n let index_size = 16 * index_shape.reduce((a, b) => a * b, 1);\n let bytes = await get_range(shard_path, {\n suffixLength: index_size + checksum_size,\n });\n index = cache[shard_path] = bytes\n ? await index_codec.decode(bytes)\n : null;\n }\n if (index === null) {\n return undefined;\n }\n let { data, shape, stride } = index;\n let linear_offset = chunk_coord\n .map((d, i) => d % shape[i])\n .reduce((acc, sel, idx) => acc + sel * stride[idx], 0);\n let offset = data[linear_offset];\n let length = data[linear_offset + 1];\n // write null chunk when 2^64-1 indicates fill value\n if (offset === MAX_BIG_UINT && length === MAX_BIG_UINT) {\n return undefined;\n }\n return get_range(shard_path, {\n offset: Number(offset),\n length: Number(length),\n });\n };\n}\n","import { create_codec_pipeline } from \"./codecs.js\";\nimport { create_sharded_chunk_getter } from \"./codecs/sharding.js\";\nimport { is_dtype, is_sharding_codec, } from \"./util.js\";\nimport { create_chunk_key_encoder, ensure_correct_scalar, get_array_order, get_ctr, get_strides, } from \"./util.js\";\nexport class Location {\n store;\n path;\n constructor(store, path = \"/\") {\n this.store = store;\n this.path = path;\n }\n resolve(path) {\n // reuse URL resolution logic built into the browser\n // handles relative paths, absolute paths, etc.\n let root = new URL(`file://${this.path.endsWith(\"/\") ? this.path : `${this.path}/`}`);\n return new Location(this.store, new URL(path, root).pathname);\n }\n}\nexport function root(store) {\n return new Location(store ?? new Map());\n}\nexport class Group extends Location {\n kind = \"group\";\n #metadata;\n constructor(store, path, metadata) {\n super(store, path);\n this.#metadata = metadata;\n }\n get attrs() {\n return this.#metadata.attributes;\n }\n}\nconst CONTEXT_MARKER = Symbol(\"zarrita.context\");\nexport function get_context(obj) {\n return obj[CONTEXT_MARKER];\n}\nfunction create_context(location, metadata) {\n let { configuration } = metadata.codecs.find(is_sharding_codec) ?? {};\n let shared_context = {\n encode_chunk_key: create_chunk_key_encoder(metadata.chunk_key_encoding),\n TypedArray: get_ctr(metadata.data_type),\n fill_value: metadata.fill_value,\n };\n if (configuration) {\n let native_order = get_array_order(configuration.codecs);\n return {\n ...shared_context,\n kind: \"sharded\",\n chunk_shape: configuration.chunk_shape,\n codec: create_codec_pipeline({\n data_type: metadata.data_type,\n shape: configuration.chunk_shape,\n codecs: configuration.codecs,\n }),\n get_strides(shape, order) {\n return get_strides(shape, order ?? native_order);\n },\n get_chunk_bytes: create_sharded_chunk_getter(location, metadata.chunk_grid.configuration.chunk_shape, shared_context.encode_chunk_key, configuration),\n };\n }\n let native_order = get_array_order(metadata.codecs);\n return {\n ...shared_context,\n kind: \"regular\",\n chunk_shape: metadata.chunk_grid.configuration.chunk_shape,\n codec: create_codec_pipeline({\n data_type: metadata.data_type,\n shape: metadata.chunk_grid.configuration.chunk_shape,\n codecs: metadata.codecs,\n }),\n get_strides(shape, order) {\n return get_strides(shape, order ?? native_order);\n },\n async get_chunk_bytes(chunk_coords, options) {\n let chunk_key = shared_context.encode_chunk_key(chunk_coords);\n let chunk_path = location.resolve(chunk_key).path;\n return location.store.get(chunk_path, options);\n },\n };\n}\nexport class Array extends Location {\n kind = \"array\";\n #metadata;\n [CONTEXT_MARKER];\n constructor(store, path, metadata) {\n super(store, path);\n this.#metadata = {\n ...metadata,\n fill_value: ensure_correct_scalar(metadata),\n };\n this[CONTEXT_MARKER] = create_context(this, metadata);\n }\n get attrs() {\n return this.#metadata.attributes;\n }\n get shape() {\n return this.#metadata.shape;\n }\n get chunks() {\n return this[CONTEXT_MARKER].chunk_shape;\n }\n get dtype() {\n return this.#metadata.data_type;\n }\n async getChunk(chunk_coords, options) {\n let context = this[CONTEXT_MARKER];\n let maybe_bytes = await context.get_chunk_bytes(chunk_coords, options);\n if (!maybe_bytes) {\n let size = context.chunk_shape.reduce((a, b) => a * b, 1);\n let data = new context.TypedArray(size);\n // @ts-expect-error: TS can't infer that `fill_value` is union (assumes never) but this is ok\n data.fill(context.fill_value);\n return {\n data,\n shape: context.chunk_shape,\n stride: context.get_strides(context.chunk_shape),\n };\n }\n return context.codec.decode(maybe_bytes);\n }\n /**\n * A helper method to narrow `zarr.Array` Dtype.\n *\n * ```typescript\n * let arr: zarr.Array<DataType, FetchStore> = zarr.open(store, { kind: \"array\" });\n *\n * // Option 1: narrow by scalar type (e.g. \"bool\", \"raw\", \"bigint\", \"number\")\n * if (arr.is(\"bigint\")) {\n * // zarr.Array<\"int64\" | \"uint64\", FetchStore>\n * }\n *\n * // Option 3: exact match\n * if (arr.is(\"float32\")) {\n * // zarr.Array<\"float32\", FetchStore, \"/\">\n * }\n * ```\n */\n is(query) {\n return is_dtype(this.dtype, query);\n }\n}\n","import { KeyError, NodeNotFoundError } from \"./errors.js\";\nimport { Array, Group, Location } from \"./hierarchy.js\";\nimport { ensure_correct_scalar, json_decode_object, v2_to_v3_array_metadata, v2_to_v3_group_metadata, } from \"./util.js\";\nlet VERSION_COUNTER = create_version_counter();\nfunction create_version_counter() {\n let version_counts = new WeakMap();\n function get_counts(store) {\n let counts = version_counts.get(store) ?? { v2: 0, v3: 0 };\n version_counts.set(store, counts);\n return counts;\n }\n return {\n increment(store, version) {\n get_counts(store)[version] += 1;\n },\n version_max(store) {\n let counts = get_counts(store);\n return counts.v3 > counts.v2 ? \"v3\" : \"v2\";\n },\n };\n}\nasync function load_attrs(location) {\n let meta_bytes = await location.store.get(location.resolve(\".zattrs\").path);\n if (!meta_bytes)\n return {};\n return json_decode_object(meta_bytes);\n}\nasync function open_v2(location, options = {}) {\n let loc = \"store\" in location ? location : new Location(location);\n let attrs = {};\n if (options.attrs ?? true)\n attrs = await load_attrs(loc);\n if (options.kind === \"array\")\n return open_array_v2(loc, attrs);\n if (options.kind === \"group\")\n return open_group_v2(loc, attrs);\n return open_array_v2(loc, attrs).catch((err) => {\n if (err instanceof NodeNotFoundError)\n return open_group_v2(loc, attrs);\n throw err;\n });\n}\nasync function open_array_v2(location, attrs) {\n let { path } = location.resolve(\".zarray\");\n let meta = await location.store.get(path);\n if (!meta) {\n throw new NodeNotFoundError(\"v2 array\", {\n cause: new KeyError(path),\n });\n }\n VERSION_COUNTER.increment(location.store, \"v2\");\n return new Array(location.store, location.path, v2_to_v3_array_metadata(json_decode_object(meta), attrs));\n}\nasync function open_group_v2(location, attrs) {\n let { path } = location.resolve(\".zgroup\");\n let meta = await location.store.get(path);\n if (!meta) {\n throw new NodeNotFoundError(\"v2 group\", {\n cause: new KeyError(path),\n });\n }\n VERSION_COUNTER.increment(location.store, \"v2\");\n return new Group(location.store, location.path, v2_to_v3_group_metadata(json_decode_object(meta), attrs));\n}\nasync function _open_v3(location) {\n let { store, path } = location.resolve(\"zarr.json\");\n let meta = await location.store.get(path);\n if (!meta) {\n throw new NodeNotFoundError(\"v3 array or group\", {\n cause: new KeyError(path),\n });\n }\n let meta_doc = json_decode_object(meta);\n if (meta_doc.node_type === \"array\") {\n meta_doc.fill_value = ensure_correct_scalar(meta_doc);\n }\n return meta_doc.node_type === \"array\"\n ? new Array(store, location.path, meta_doc)\n : new Group(store, location.path, meta_doc);\n}\nasync function open_v3(location, options = {}) {\n let loc = \"store\" in location ? location : new Location(location);\n let node = await _open_v3(loc);\n VERSION_COUNTER.increment(loc.store, \"v3\");\n if (options.kind === undefined)\n return node;\n if (options.kind === \"array\" && node instanceof Array)\n return node;\n if (options.kind === \"group\" && node instanceof Group)\n return node;\n let kind = node instanceof Array ? \"array\" : \"group\";\n throw new Error(`Expected node of kind ${options.kind}, found ${kind}.`);\n}\nexport async function open(location, options = {}) {\n let store = \"store\" in location ? location.store : location;\n let version_max = VERSION_COUNTER.version_max(store);\n // Use the open function for the version with the most successful opens.\n // Note that here we use the dot syntax to access the open functions\n // because this enables us to use vi.spyOn during testing.\n let open_primary = version_max === \"v2\" ? open.v2 : open.v3;\n let open_secondary = version_max === \"v2\" ? open.v3 : open.v2;\n return open_primary(location, options).catch((err) => {\n if (err instanceof NodeNotFoundError) {\n return open_secondary(location, options);\n }\n throw err;\n });\n}\nopen.v2 = open_v2;\nopen.v3 = open_v3;\n","export function strip_prefix(path) {\n // @ts-expect-error - TS can't infer this type correctly\n return path.slice(1);\n}\nexport function uri2href(url) {\n let [protocol, rest] = (typeof url === \"string\" ? url : url.href).split(\"://\");\n if (protocol === \"https\" || protocol === \"http\") {\n return url;\n }\n if (protocol === \"gc\") {\n return `https://storage.googleapis.com/${rest}`;\n }\n if (protocol === \"s3\") {\n return `https://s3.amazonaws.com/${rest}`;\n }\n throw Error(`Protocol not supported, got: ${JSON.stringify(protocol)}`);\n}\nexport function fetch_range(url, offset, length, opts = {}) {\n if (offset !== undefined && length !== undefined) {\n // merge request opts\n opts = {\n ...opts,\n headers: {\n ...opts.headers,\n Range: `bytes=${offset}-${offset + length - 1}`,\n },\n };\n }\n return fetch(url, opts);\n}\nexport function merge_init(storeOverrides, requestOverrides) {\n // Request overrides take precedence over storeOverrides.\n return {\n ...storeOverrides,\n ...requestOverrides,\n headers: {\n ...storeOverrides.headers,\n ...requestOverrides.headers,\n },\n };\n}\n","import { fetch_range, merge_init } from \"./util.js\";\nfunction resolve(root, path) {\n const base = typeof root === \"string\" ? new URL(root) : root;\n if (!base.pathname.endsWith(\"/\")) {\n // ensure trailing slash so that base is resolved as _directory_\n base.pathname += \"/\";\n }\n const resolved = new URL(path.slice(1), base);\n // copy search params to new URL\n resolved.search = base.search;\n return resolved;\n}\nasync function handle_response(response) {\n if (response.status === 404) {\n return undefined;\n }\n if (response.status === 200 || response.status === 206) {\n return new Uint8Array(await response.arrayBuffer());\n }\n throw new Error(`Unexpected response status ${response.status} ${response.statusText}`);\n}\nasync function fetch_suffix(url, suffix_length, init, use_suffix_request) {\n if (use_suffix_request) {\n return fetch(url, {\n ...init,\n headers: { ...init.headers, Range: `bytes=-${suffix_length}` },\n });\n }\n let response = await fetch(url, { ...init, method: \"HEAD\" });\n if (!response.ok) {\n // will be picked up by handle_response\n return response;\n }\n let content_length = response.headers.get(\"Content-Length\");\n let length = Number(content_length);\n return fetch_range(url, length - suffix_length, length, init);\n}\n/**\n * Readonly store based in the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n * Must polyfill `fetch` for use in Node.js.\n *\n * ```typescript\n * import * as zarr from \"@zarrita/core\";\n * const store = new FetchStore(\"http://localhost:8080/data.zarr\");\n * const arr = await zarr.get(store, { kind: \"array\" });\n * ```\n */\nclass FetchStore {\n url;\n #overrides;\n #use_suffix_request;\n constructor(url, options = {}) {\n this.url = url;\n this.#overrides = options.overrides ?? {};\n this.#use_suffix_request = options.useSuffixRequest ?? false;\n }\n #merge_init(overrides) {\n return merge_init(this.#overrides, overrides);\n }\n async get(key, options = {}) {\n let href = resolve(this.url, key).href;\n let response = await fetch(href, this.#merge_init(options));\n return handle_response(response);\n }\n async getRange(key, range, options = {}) {\n let url = resolve(this.url, key);\n let init = this.#merge_init(options);\n let response;\n if (\"suffixLength\" in range) {\n response = await fetch_suffix(url, range.suffixLength, init, this.#use_suffix_request);\n }\n else {\n response = await fetch_range(url, range.offset, range.length, init);\n }\n return handle_response(response);\n }\n}\nexport default FetchStore;\n","/** Similar to python's `range` function. Supports positive ranges only. */\nexport function* range(start, stop, step = 1) {\n if (stop === undefined) {\n stop = start;\n start = 0;\n }\n for (let i = start; i < stop; i += step) {\n yield i;\n }\n}\n/**\n * python-like itertools.product generator\n * https://gist.github.com/cybercase/db7dde901d7070c98c48\n */\nexport function* product(...iterables) {\n if (iterables.length === 0) {\n return;\n }\n // make a list of iterators from the iterables\n const iterators = iterables.map((it) => it[Symbol.iterator]());\n const results = iterators.map((it) => it.next());\n if (results.some((r) => r.done)) {\n throw new Error(\"Input contains an empty iterator.\");\n }\n for (let i = 0;;) {\n if (results[i].done) {\n // reset the current iterator\n iterators[i] = iterables[i][Symbol.iterator]();\n results[i] = iterators[i].next();\n // advance, and exit if we've reached the end\n if (++i >= iterators.length) {\n return;\n }\n }\n else {\n // @ts-expect-error - TS can't infer this\n yield results.map(({ value }) => value);\n i = 0;\n }\n results[i] = iterators[i].next();\n }\n}\n// https://github.com/python/cpython/blob/263c0dd16017613c5ea2fbfc270be4de2b41b5ad/Objects/sliceobject.c#L376-L519\nexport function slice_indices({ start, stop, step }, length) {\n if (step === 0) {\n throw new Error(\"slice step cannot be zero\");\n }\n step = step ?? 1;\n const step_is_negative = step < 0;\n /* Find lower and upper bounds for start and stop. */\n const [lower, upper] = step_is_negative ? [-1, length - 1] : [0, length];\n /* Compute start. */\n if (start === null) {\n start = step_is_negative ? upper : lower;\n }\n else {\n if (start < 0) {\n start += length;\n if (start < lower) {\n start = lower;\n }\n }\n else if (start > upper) {\n start = upper;\n }\n }\n /* Compute stop. */\n if (stop === null) {\n stop = step_is_negative ? lower : upper;\n }\n else {\n if (stop < 0) {\n stop += length;\n if (stop < lower) {\n stop = lower;\n }\n }\n else if (stop > upper) {\n stop = upper;\n }\n }\n return [start, stop, step];\n}\nexport function slice(start, stop, step = null) {\n if (stop === undefined) {\n stop = start;\n start = null;\n }\n return {\n start,\n stop,\n step,\n };\n}\n/** Built-in \"queue\" for awaiting promises. */\nexport function create_queue() {\n const promises = [];\n return {\n add: (fn) => promises.push(fn()),\n onIdle: () => Promise.all(promises),\n };\n}\n","import { product, range, slice, slice_indices } from \"./util.js\";\nexport class IndexError extends Error {\n constructor(msg) {\n super(msg);\n this.name = \"IndexError\";\n }\n}\nfunction err_too_many_indices(selection, shape) {\n throw new IndexError(`too many indicies for array; expected ${shape.length}, got ${selection.length}`);\n}\nfunction err_boundscheck(dim_len) {\n throw new IndexError(`index out of bounds for dimension with length ${dim_len}`);\n}\nfunction err_negative_step() {\n throw new IndexError(\"only slices with step >= 1 are supported\");\n}\nfunction check_selection_length(selection, shape) {\n if (selection.length > shape.length) {\n err_too_many_indices(selection, shape);\n }\n}\nexport function normalize_integer_selection(dim_sel, dim_len) {\n // normalize type to int\n dim_sel = Math.trunc(dim_sel);\n // handle wraparound\n if (dim_sel < 0) {\n dim_sel = dim_len + dim_sel;\n }\n // handle out of bounds\n if (dim_sel >= dim_len || dim_sel < 0) {\n err_boundscheck(dim_len);\n }\n return dim_sel;\n}\nclass IntDimIndexer {\n dim_sel;\n dim_len;\n dim_chunk_len;\n nitems;\n constructor({ dim_sel, dim_len, dim_chunk_len }) {\n // normalize\n dim_sel = normalize_integer_selection(dim_sel, dim_len);\n // store properties\n this.dim_sel = dim_sel;\n this.dim_len = dim_len;\n this.dim_chunk_len = dim_chunk_len;\n this.nitems = 1;\n }\n *[Symbol.iterator]() {\n const dim_chunk_ix = Math.floor(this.dim_sel / this.dim_chunk_len);\n const dim_offset = dim_chunk_ix * this.dim_chunk_len;\n const dim_chunk_sel = this.dim_sel - dim_offset;\n yield { dim_chunk_ix, dim_chunk_sel };\n }\n}\nclass SliceDimIndexer {\n start;\n stop;\n step;\n dim_len;\n dim_chunk_len;\n nitems;\n nchunks;\n constructor({ dim_sel, dim_len, dim_chunk_len }) {\n // normalize\n const [start, stop, step] = slice_indices(dim_sel, dim_len);\n this.start = start;\n this.stop = stop;\n this.step = step;\n if (this.step < 1)\n err_negative_step();\n // store properties\n this.dim_len = dim_len;\n this.dim_chunk_len = dim_chunk_len;\n this.nitems = Math.max(0, Math.ceil((this.stop - this.start) / this.step));\n this.nchunks = Math.ceil(this.dim_len / this.dim_chunk_len);\n }\n *[Symbol.iterator]() {\n // figure out the range of chunks we need to visit\n const dim_chunk_ix_from = Math.floor(this.start / this.dim_chunk_len);\n const dim_chunk_ix_to = Math.ceil(this.stop / this.dim_chunk_len);\n for (const dim_chunk_ix of range(dim_chunk_ix_from, dim_chunk_ix_to)) {\n // compute offsets for chunk within overall array\n const dim_offset = dim_chunk_ix * this.dim_chunk_len;\n const dim_limit = Math.min(this.dim_len, (dim_chunk_ix + 1) * this.dim_chunk_len);\n // determine chunk length, accounting for trailing chunk\n const dim_chunk_len = dim_limit - dim_offset;\n let dim_out_offset = 0;\n let dim_chunk_sel_start = 0;\n if (this.start < dim_offset) {\n // selection start before current chunk\n const remainder = (dim_offset - this.start) % this.step;\n if (remainder)\n dim_chunk_sel_start += this.step - remainder;\n // compute number of previous items, provides offset into output array\n dim_out_offset = Math.ceil((dim_offset - this.start) / this.step);\n }\n else {\n // selection starts within current chunk\n dim_chunk_sel_start = this.start - dim_offset;\n }\n // selection starts within current chunk if true,\n // otherwise selection ends after current chunk.\n const dim_chunk_sel_stop = this.stop > dim_limit ? dim_chunk_len : this.stop - dim_offset;\n const dim_chunk_sel = [\n dim_chunk_sel_start,\n dim_chunk_sel_stop,\n this.step,\n ];\n const dim_chunk_nitems = Math.ceil((dim_chunk_sel_stop - dim_chunk_sel_start) / this.step);\n const dim_out_sel = [\n dim_out_offset,\n dim_out_offset + dim_chunk_nitems,\n 1,\n ];\n yield { dim_chunk_ix, dim_chunk_sel, dim_out_sel };\n }\n }\n}\nexport function normalize_selection(selection, shape) {\n let normalized = [];\n if (selection === null) {\n normalized = shape.map((_) => slice(null));\n }\n else if (Array.isArray(selection)) {\n normalized = selection.map((s) => s ?? slice(null));\n }\n check_selection_length(normalized, shape);\n return normalized;\n}\nexport class BasicIndexer {\n dim_indexers;\n shape;\n constructor({ selection, shape, chunk_shape }) {\n // setup per-dimension indexers\n this.dim_indexers = normalize_selection(selection, shape).map((dim_sel, i) => {\n return new (typeof dim_sel === \"number\" ? IntDimIndexer : SliceDimIndexer)({\n // @ts-expect-error ts inference not strong enough to know correct chunk\n dim_sel: dim_sel,\n dim_len: shape[i],\n dim_chunk_len: chunk_shape[i],\n });\n });\n this.shape = this.dim_indexers\n .filter((ixr) => ixr instanceof SliceDimIndexer)\n .map((sixr) => sixr.nitems);\n }\n *[Symbol.iterator]() {\n for (const dim_projections of product(...this.dim_indexers)) {\n const chunk_coords = dim_projections.map((p) => p.dim_chunk_ix);\n const mapping = dim_projections.map((p) => {\n if (\"dim_out_sel\" in p) {\n return { from: p.dim_chunk_sel, to: p.dim_out_sel };\n }\n return { from: p.dim_chunk_sel, to: null };\n });\n yield { chunk_coords, mapping };\n }\n }\n}\n","import { _internal_get_array_context } from \"@zarrita/core\";\nimport { BasicIndexer } from \"./indexer.js\";\nimport { create_queue } from \"./util.js\";\nfunction unwrap(arr, idx) {\n return (\"get\" in arr ? arr.get(idx) : arr[idx]);\n}\nexport async function get(arr, selection, opts, setter) {\n let context = _internal_get_array_context(arr);\n let indexer = new BasicIndexer({\n selection,\n shape: arr.shape,\n chunk_shape: arr.chunks,\n });\n let out = setter.prepare(new context.TypedArray(indexer.shape.reduce((a, b) => a * b, 1)), indexer.shape, context.get_strides(indexer.shape, opts.order));\n let queue = opts.create_queue?.() ?? create_queue();\n for (const { chunk_coords, mapping } of indexer) {\n queue.add(async () => {\n let { data, shape, stride } = await arr.getChunk(chunk_coords, opts.opts);\n let chunk = setter.prepare(data, shape, stride);\n setter.set_from_chunk(out, chunk, mapping);\n });\n }\n await queue.onIdle();\n // If the final out shape is empty, we just return a scalar.\n // @ts-expect-error - TS can't narrow this conditional type\n return indexer.shape.length === 0 ? unwrap(out.data, 0) : out;\n}\n","import { get as get_with_setter } from \"./get.js\";\nimport { set as set_with_setter } from \"./set.js\";\n/** A 1D \"view\" of an array that can be used to set values in the array. */\nfunction object_array_view(arr, offset = 0, size) {\n let length = size ?? arr.length - offset;\n return {\n length,\n subarray(from, to = length) {\n return object_array_view(arr, offset + from, to - from);\n },\n set(data, start = 0) {\n for (let i = 0; i < data.length; i++) {\n arr[offset + start + i] = data.get(i);\n }\n },\n get(index) {\n return arr[offset + index];\n },\n };\n}\n/**\n * Convert a chunk to a Uint8Array that can be used with the binary\n * set functions. This is necessary because the binary set functions\n * require a contiguous block of memory, and allows us to support more than\n * just the browser's TypedArray objects.\n *\n * WARNING: This function is not meant to be used directly and is NOT type-safe.\n * In the case of `Array` instances, it will return a `object_array_view` of\n * the underlying, which is supported by our binary set functions.\n */\nfunction compat_chunk(arr) {\n if (globalThis.Array.isArray(arr.data)) {\n return {\n // @ts-expect-error\n data: object_array_view(arr.data),\n stride: arr.stride,\n bytes_per_element: 1,\n };\n }\n return {\n data: new Uint8Array(arr.data.buffer, arr.data.byteOffset, arr.data.byteLength),\n stride: arr.stride,\n bytes_per_element: arr.data.BYTES_PER_ELEMENT,\n };\n}\n/** Hack to get the constructor of a typed array constructor from an existing TypedArray. */\nfunction get_typed_array_constructor(arr) {\n if (\"chars\" in arr) {\n // our custom TypedArray needs to bind the number of characters per\n // element to the constructor.\n return arr.constructor.bind(null, arr.chars);\n }\n return arr.constructor;\n}\n/**\n * Convert a scalar to a Uint8Array that can be used with the binary\n * set functions. This is necessary because the binary set functions\n * require a contiguous block of memory, and allows us to support more\n * than just the browser's TypedArray objects.\n *\n * WARNING: This function is not meant to be used directly and is NOT type-safe.\n * In the case of `Array` instances, it will return a `object_array_view` of\n * the scalar, which is supported by our binary set functions.\n */\nfunction compat_scalar(arr, value) {\n if (globalThis.Array.isArray(arr.data)) {\n // @ts-expect-error\n return object_array_view([value]);\n }\n let TypedArray = get_typed_array_constructor(arr.data);\n // @ts-expect-error - value is a scalar and matches\n let data = new TypedArray([value]);\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n}\nexport const setter = {\n prepare(data, shape, stride) {\n return { data, shape, stride };\n },\n set_scalar(dest, sel, value) {\n let view = compat_chunk(dest);\n set_scalar_binary(view, sel, compat_scalar(dest, value), view.bytes_per_element);\n },\n set_from_chunk(dest, src, projections) {\n let view = compat_chunk(dest);\n set_from_chunk_binary(view, compat_chunk(src), view.bytes_per_element, projections);\n },\n};\n/** @category Utility */\nexport async function get(arr, selection = null, opts = {}) {\n return get_with_setter(arr, selection, opts, setter);\n}\n/** @category Utility */\nexport async function set(arr, selection, value, opts = {}) {\n return set_with_setter(arr, selection, value, opts, setter);\n}\nfunction indices_len(start, stop, step) {\n if (step < 0 && stop < start) {\n return Math.floor((start - stop - 1) / -step) + 1;\n }\n if (start < stop)\n return Math.floor((stop - start - 1) / step) + 1;\n return 0;\n}\nfunction set_scalar_binary(out, out_selection, value, bytes_per_element) {\n if (out_selection.length === 0) {\n out.data.set(value, 0);\n return;\n }\n const [slice, ...slices] = out_selection;\n const [curr_stride, ...stride] = out.stride;\n if (typeof slice === \"number\") {\n const data = out.data.subarray(curr_stride * slice * bytes_per_element);\n set_scalar_binary({ data, stride }, slices, value, bytes_per_element);\n return;\n }\n const [from, to, step] = slice;\n const len = indices_len(from, to, step);\n if (slices.length === 0) {\n for (let i = 0; i < len; i++) {\n out.data.set(value, curr_stride * (from + step * i) * bytes_per_element);\n }\n return;\n }\n for (let i = 0; i < len; i++) {\n const data = out.data.subarray(curr_stride * (from + step * i) * bytes_per_element);\n set_scalar_binary({ data, stride }, slices, value, bytes_per_element);\n }\n}\nfunction set_from_chunk_binary(dest, src, bytes_per_element, projections) {\n const [proj, ...projs] = projections;\n const [dstride, ...dstrides] = dest.stride;\n const [sstride, ...sstrides] = src.stride;\n if (proj.from === null) {\n if (projs.length === 0) {\n dest.data.set(src.data.subarray(0, bytes_per_element), proj.to * bytes_per_element);\n return;\n }\n set_from_chunk_binary({\n data: dest.data.subarray(dstride * proj.to * bytes_per_element),\n stride: dstrides,\n }, src, bytes_per_element, projs);\n return;\n }\n if (proj.to === null) {\n if (projs.length === 0) {\n let offset = proj.from * bytes_per_element;\n dest.data.set(src.data.subarray(offset, offset + bytes_per_element), 0);\n return;\n }\n set_from_chunk_binary(dest, {\n data: src.data.subarray(sstride * proj.from * bytes_per_element),\n stride: sstrides,\n }, bytes_per_element, projs);\n return;\n }\n const [from, to, step] = proj.to;\n const [sfrom, _, sstep] = proj.from;\n const len = indices_len(from, to, step);\n if (projs.length === 0) {\n // NB: we have a contiguous block of memory\n // so we can just copy over all the data at once.\n if (step === 1 && sstep === 1 && dstride === 1 && sstride === 1) {\n let offset = sfrom * bytes_per_element;\n let size = len * bytes_per_element;\n dest.data.set(src.data.subarray(offset, offset + size), from * bytes_per_element);\n return;\n }\n // Otherwise, we have to copy over each element individually.\n for (let i = 0; i < len; i++) {\n let offset = sstride * (sfrom + sstep * i) * bytes_per_element;\n dest.data.set(src.data.subarray(offset, offset + bytes_per_element), dstride * (from + step * i) * bytes_per_element);\n }\n return;\n }\n for (let i = 0; i < len; i++) {\n set_from_chunk_binary({\n data: dest.data.subarray(dstride * (from + i * step) * bytes_per_element),\n stride: dstrides,\n }, {\n data: src.data.subarray(sstride * (sfrom + i * sstep) * bytes_per_element),\n stride: sstrides,\n }, bytes_per_element, projs);\n }\n}\n","// This file is copied from https://github.com/manzt/zarrita.js/pull/161\n\nimport type { AbsolutePath, AsyncReadable } from \"@zarrita/storage\";\n\n/**\n * Get a file handle to a file in a directory.\n *\n * @param root - A root directory from the Web File System API.\n * @param path - A key to a file in the root directory.\n * @returns A file handle to the file.\n */\nasync function resolveFileHandleForPath(\n root: FileSystemDirectoryHandle,\n path: string\n): Promise<FileSystemFileHandle> {\n const dirs = path.split(\"/\");\n const fname = dirs.pop();\n if (!fname) {\n throw new Error(\"Invalid path\");\n }\n for (const dir of dirs) {\n root = await root.getDirectoryHandle(dir);\n }\n return root.getFileHandle(fname);\n}\n\n/**\n * A store for zarrita based on the Web File System API.\n *\n * Note: usage requires prompting the user to select a directory to grant\n * access to the Web File System API.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/File_System_API}\n *\n * @example\n * ```js\n * import * as zarr from \"zarrita\";\n * import WebFileSystemStore from \"@zarrita/storage/web-fs\";\n *\n * let directoryHandle = await globalThis.showDirectoryPicker();\n * let store = new WebFileSystemStore(directoryHandle);\n * let root = await zarr.root(store);\n * let arr = await zarr.open(root.resolve(\"/foo\"), { kind: \"array\" });\n * ```\n */\nclass WebFileSystemStore implements AsyncReadable {\n #root: FileSystemDirectoryHandle;\n\n constructor(root: FileSystemDirectoryHandle) {\n this.#root = root;\n }\n\n get directoryHandle(): FileSystemDirectoryHandle {\n return this.#root;\n }\n\n async get(key: AbsolutePath): Promise<Uint8Array | undefined> {\n const fh = await resolveFileHandleForPath(this.#root, key.slice(1)).catch(\n () => {\n // TODO: better error handling\n // I believe a missing file will trigger an error here, which we should explicitly\n // catch and return `undefined`\n return undefined;\n }\n );\n if (!fh) {\n return undefined;\n }\n const file = await fh.getFile();\n const buffer = await file.arrayBuffer();\n return new Uint8Array(buffer);\n }\n}\n\nexport default WebFileSystemStore;\n","import * as zarr from \"zarrita\";\nimport { Location } from \"@zarrita/core\";\nimport { Readable } from \"@zarrita/storage\";\nimport FetchStore from \"@zarrita/storage/fetch\";\nimport WebFileSystemStore from \"./web_file_system_store\";\n\nexport type Version = \"v2\" | \"v3\";\n\nexport type ZarrArrayParams = {\n arrayPath: string;\n zarrVersion: Version | undefined;\n} & (\n | {\n type: \"fetch\";\n url: string;\n fetchOptions?: {\n overrides?: RequestInit;\n useSuffixRequest?: boolean;\n };\n }\n | {\n type: \"filesystem\";\n directoryHandle: FileSystemDirectoryHandle;\n path: string;\n }\n);\n\nexport async function openGroup(\n location: zarr.Location<Readable>,\n version?: Version\n): Promise<zarr.Group<Readable>> {\n if (version === \"v2\") {\n try {\n return zarr.open.v2(location, { kind: \"group\", attrs: true });\n } catch {\n throw new Error(`Failed to open Zarr v2 group at ${location}`);\n }\n }\n if (version === \"v3\") {\n try {\n return zarr.open.v3(location, { kind: \"group\" });\n } catch {\n throw new Error(`Failed to open Zarr v3 group at ${location}`);\n }\n }\n try {\n return zarr.open(location, { kind: \"group\" });\n } catch {\n throw new Error(`Failed to open Zarr group at ${location}`);\n }\n}\n\nexport async function openArray(\n location: zarr.Location<Readable>,\n version?: Version\n): Promise<zarr.Array<zarr.DataType, Readable>> {\n if (version === \"v2\") {\n try {\n return zarr.open.v2(location, { kind: \"array\", attrs: false });\n } catch {\n throw new Error(`Failed to open Zarr v2 array at ${location}`);\n }\n }\n if (version === \"v3\") {\n try {\n return zarr.open.v3(location, { kind: \"array\" });\n } catch {\n throw new Error(`Failed to open Zarr v3 array at ${location}`);\n }\n }\n try {\n return zarr.open(location, { kind: \"array\" });\n } catch {\n throw new Error(`Failed to open Zarr array at ${location}`);\n }\n}\n\nexport async function openArrayFromParams(\n params: ZarrArrayParams\n): Promise<zarr.Array<zarr.DataType, Readable>> {\n let rootLocation: Location<Readable>;\n\n switch (params.type) {\n case \"fetch\": {\n rootLocation = new Location(\n new FetchStore(params.url, params.fetchOptions)\n );\n break;\n }\n case \"filesystem\": {\n rootLocation = new Location(\n new WebFileSystemStore(params.directoryHandle),\n params.path as `/${string}`\n );\n break;\n }\n default: {\n const exhaustiveCheck: never = params;\n throw new Error(`Unsupported store type: ${exhaustiveCheck}`);\n }\n }\n\n const arrayLocation = params.arrayPath\n ? rootLocation.resolve(params.arrayPath)\n : rootLocation;\n\n return openArray(arrayLocation, params.zarrVersion);\n}\n\nexport function createZarrArrayParams(\n location: Location<Readable>,\n arrayPath: string,\n zarrVersion: Version | undefined\n): ZarrArrayParams {\n if (location.store instanceof FetchStore) {\n return {\n type: \"fetch\",\n arrayPath,\n zarrVersion,\n url: (location.store as FetchStore).url.toString(),\n };\n } else if (location.store instanceof WebFileSystemStore) {\n return {\n type: \"filesystem\",\n arrayPath,\n zarrVersion,\n directoryHandle: location.store.directoryHandle,\n path: location.path,\n };\n } else {\n throw new Error(\n `Unsupported store type: ${location.store.constructor.name}`\n );\n }\n}\n","import * as zarr from \"zarrita\";\nimport { Readable } from \"@zarrita/storage\";\nimport { Logger } from \"../../utilities/logger\";\nimport { ZarrArrayParams } from \"../zarr/open\";\nimport { ZarrWorkerRequest, ZarrWorkerResponse } from \"./worker_kernel\";\n// \"inline\" import to ensure worker code works in dependent projects\n// this is a workaround for a vite limitation when building a library\n// see https://github.com/vitejs/vite/issues/11672\nimport WorkerKernel from \"./worker_kernel.ts?worker&inline\";\n\ntype PendingGetChunkRequest = {\n resolve: (value: zarr.Chunk<zarr.DataType>) => void;\n reject: (error: Error) => void;\n abortListener?: () => void;\n abortSignal?: AbortSignal;\n workerId: number;\n};\n\ntype WorkerInstance = {\n worker: Worker;\n pendingCount: number;\n workerId: number;\n};\n\nconst DEFAULT_WORKER_COUNT = Math.min(navigator.hardwareConcurrency, 8);\nlet workerPool: WorkerInstance[] = [];\nlet messageId = 0;\nlet workerId = 0;\nconst pendingMessages = new Map<number, PendingGetChunkRequest>();\nconst canceledMessages = new Set<number>();\n\nfunction getWorkerInstance(worker: Worker): WorkerInstance | undefined {\n const instance = workerPool.find((w) => w.worker === worker);\n if (!instance) {\n Logger.error(\n \"ZarrWorker\",\n \"Worker not found in pool - this should not happen\"\n );\n }\n return instance;\n}\n\nfunction handleWorkerMessage(\n e: MessageEvent<ZarrWorkerResponse>,\n worker: Worker\n): void {\n const { id, success } = e.data;\n const pending = pendingMessages.get(id);\n\n if (!pending) {\n if (canceledMessages.has(id)) {\n canceledMessages.delete(id);\n } else {\n Logger.warn(\n \"ZarrWorker\",\n `Received response for unknown message ID ${id}:`,\n e.data\n );\n }\n return;\n }\n\n pendingMessages.delete(id);\n\n if (pending.abortListener && pending.abortSignal) {\n pending.abortSignal.removeEventListener(\"abort\", pending.abortListener);\n }\n\n const workerInstance = getWorkerInstance(worker);\n if (workerInstance && workerInstance.pendingCount > 0) {\n workerInstance.pendingCount--;\n } else if (workerInstance) {\n Logger.error(\n \"ZarrWorker\",\n \"Received message but no pending tasks - this should not happen\"\n );\n }\n\n if (success && e.data.type === \"getChunk\") {\n pending.resolve(e.data.chunk);\n } else if (!success) {\n pending.reject(new Error(e.data.error || \"Unknown worker error\"));\n }\n}\n\nfunction handleWorkerError(\n error: ErrorEvent | MessageEvent,\n worker: Worker\n): void {\n if (error instanceof MessageEvent) {\n Logger.error(\n \"ZarrWorker\",\n \"Message serialization error occurred - worker remains active\"\n );\n return;\n }\n\n Logger.error(\n \"ZarrWorker\",\n `Worker failed - replacing worker and canceling its in-flight messages`,\n error.message\n );\n\n const workerInstance = getWorkerInstance(worker);\n if (workerInstance) {\n const workerIndex = workerPool.indexOf(workerInstance);\n workerPool.splice(workerIndex, 1);\n }\n\n const failedWorkerId = workerInstance?.workerId;\n if (failedWorkerId !== undefined) {\n for (const [id, pending] of pendingMessages.entries()) {\n if (pending.workerId === failedWorkerId) {\n pending.reject(new Error(`Worker error: ${error.message}`));\n pendingMessages.delete(id);\n }\n }\n }\n\n try {\n const replacementWorker = createWorker();\n workerPool.push({\n worker: replacementWorker,\n pendingCount: 0,\n workerId: workerId++,\n });\n Logger.debug(\"ZarrWorker\", \"Replacement worker created successfully\");\n } catch (err) {\n Logger.error(\"ZarrWorker\", \"Failed to create replacement worker\", err);\n }\n}\n\nfunction createWorker(): Worker {\n const worker = new WorkerKernel();\n\n worker.addEventListener(\"message\", (e) => handleWorkerMessage(e, worker));\n worker.addEventListener(\"error\", (error) => handleWorkerError(error, worker));\n worker.addEventListener(\"messageerror\", (error) =>\n handleWorkerError(error, worker)\n );\n\n return worker;\n}\n\nfunction getLeastBusyWorker(): WorkerInstance {\n if (workerPool.length === 0) {\n throw new Error(\"Worker pool is not initialized\");\n }\n return workerPool.sort((a, b) => a.pendingCount - b.pendingCount)[0];\n}\n\nasync function getChunkInWorker(\n zarrParams: ZarrArrayParams,\n chunkIndex: number[],\n options?: { signal?: AbortSignal }\n): Promise<zarr.Chunk<zarr.DataType>> {\n return new Promise((resolve, reject) => {\n const workerInstance = getLeastBusyWorker();\n\n const id = messageId++;\n const pending: PendingGetChunkRequest = {\n resolve,\n reject,\n workerId: workerInstance.workerId,\n };\n pendingMessages.set(id, pending);\n\n // set up cancellation in the worker thread if an AbortSignal is provided\n if (options?.signal) {\n const abortListener = () => {\n workerInstance.worker.postMessage({\n id: id,\n type: \"cancel\",\n } as ZarrWorkerRequest);\n\n pendingMessages.delete(id);\n canceledMessages.add(id);\n\n workerInstance.pendingCount--;\n\n reject(new DOMException(\"Operation was aborted\", \"AbortError\"));\n };\n\n if (options.signal.aborted) {\n abortListener();\n // delete now, message canceled before it was even posted\n canceledMessages.delete(id);\n return;\n }\n\n options.signal.addEventListener(\"abort\", abortListener, { once: true });\n\n pending.abortListener = abortListener;\n pending.abortSignal = options.signal;\n }\n\n workerInstance.pendingCount++;\n\n workerInstance.worker.postMessage({\n id: id,\n type: \"getChunk\",\n arrayParams: zarrParams,\n index: chunkIndex,\n } as ZarrWorkerRequest);\n });\n}\n\nfunction ensureWorkerPool(): void {\n if (workerPool.length > 0) return;\n\n try {\n for (let i = 0; i < DEFAULT_WORKER_COUNT; i++) {\n const worker = createWorker();\n workerPool.push({\n worker,\n pendingCount: 0,\n workerId: workerId++,\n });\n }\n Logger.debug(\n \"ZarrWorker\",\n `Initialized worker pool with ${workerPool.length} workers`\n );\n } catch {\n Logger.warn(\"ZarrWorker\", \"Failed to create workers - clearing pool\");\n terminateWorkerPool();\n return;\n }\n}\n\nexport async function getChunk(\n array: zarr.Array<zarr.DataType, Readable>,\n arrayParams: ZarrArrayParams,\n chunkCoords: number[],\n options?: { signal?: AbortSignal }\n): Promise<zarr.Chunk<zarr.DataType>> {\n ensureWorkerPool();\n try {\n return await getChunkInWorker(arrayParams, chunkCoords, options);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw error;\n }\n\n Logger.warn(\"ZarrWorker\", \"Falling back to main thread\", error);\n const chunk = await array.getChunk(chunkCoords, options);\n\n return chunk;\n }\n}\n\nexport function terminateWorkerPool(): void {\n for (const workerInstance of workerPool) {\n workerInstance.worker.terminate();\n }\n workerPool = [];\n pendingMessages.clear();\n}\n","import * as zarr from \"zarrita\";\nimport { Slice } from \"@zarrita/indexing\";\n\nimport { Region } from \"../region\";\nimport {\n Chunk,\n SourceDimension,\n SourceDimensionMap,\n isChunkData,\n ChunkData,\n ChunkDataConstructor,\n SourceDimensionLod,\n} from \"../chunk\";\nimport { isTextureUnpackRowAlignment } from \"../../objects/textures/texture\";\nimport { PromiseScheduler } from \"../promise_scheduler\";\n\nimport { Image as OmeZarrImage } from \"./0.5/image\";\n\nimport { Readable } from \"@zarrita/storage\";\nimport { ZarrArrayParams } from \"../zarr/open\";\nimport { getChunk } from \"./worker_pool\";\n\n// Implements the interface required for getting array chunks in zarrita:\n// https://github.com/manzt/zarrita.js/blob/c15c1a14e42a83516972368ac962ebdf56a6dcdb/packages/indexing/src/types.ts#L52\nexport class PromiseQueue<T> {\n private readonly promises_: Array<() => Promise<T>> = [];\n private readonly scheduler_: PromiseScheduler;\n\n constructor(scheduler: PromiseScheduler) {\n this.scheduler_ = scheduler;\n }\n\n add(promise: () => Promise<T>) {\n this.promises_.push(promise);\n }\n\n onIdle(): Promise<Array<T>> {\n return Promise.all(this.promises_.map((p) => this.scheduler_.submit(p)));\n }\n}\n\ntype OmeZarrImageLoaderProps = {\n metadata: OmeZarrImage[\"ome\"][\"multiscales\"][number];\n arrays: zarr.Array<zarr.DataType, Readable>[];\n arrayParams: ZarrArrayParams[];\n};\n\n// Loads chunks from a multiscale image implementing OME-Zarr v0.5:\n// https://ngff.openmicroscopy.org/0.5/#image-layout\nexport class OmeZarrImageLoader {\n private readonly metadata_: OmeZarrImage[\"ome\"][\"multiscales\"][number];\n private readonly arrays_: ReadonlyArray<zarr.Array<zarr.DataType, Readable>>;\n private readonly arrayParams_: ReadonlyArray<ZarrArrayParams>;\n private readonly dimensions_: SourceDimensionMap;\n\n constructor(props: OmeZarrImageLoaderProps) {\n this.metadata_ = props.metadata;\n this.arrays_ = props.arrays;\n this.arrayParams_ = props.arrayParams;\n this.dimensions_ = inferSourceDimensionMap(this.metadata_, this.arrays_);\n }\n\n public getSourceDimensionMap(): SourceDimensionMap {\n return this.dimensions_;\n }\n\n public async loadChunkData(chunk: Chunk, signal: AbortSignal) {\n const chunkCoords: number[] = [];\n chunkCoords[this.dimensions_.x.index] = chunk.chunkIndex.x;\n chunkCoords[this.dimensions_.y.index] = chunk.chunkIndex.y;\n if (this.dimensions_.z) {\n chunkCoords[this.dimensions_.z.index] = chunk.chunkIndex.z;\n }\n if (this.dimensions_.c) {\n chunkCoords[this.dimensions_.c.index] = chunk.chunkIndex.c;\n }\n if (this.dimensions_.t) {\n chunkCoords[this.dimensions_.t.index] = chunk.chunkIndex.t;\n }\n\n const array = this.arrays_[chunk.lod];\n const arrayParams = this.arrayParams_[chunk.lod];\n const receivedChunk = await getChunk(array, arrayParams, chunkCoords, {\n signal,\n });\n\n if (!isChunkData(receivedChunk.data)) {\n throw new Error(\n `Received chunk has an unsupported data type, data=${receivedChunk.data.constructor.name}`\n );\n }\n\n validateTightlyPackedChunk(receivedChunk);\n\n const receivedShape = {\n x: receivedChunk.shape[this.dimensions_.x.index],\n y: receivedChunk.shape[this.dimensions_.y.index],\n z: this.dimensions_.z\n ? receivedChunk.shape[this.dimensions_.z.index]\n : chunk.shape.z,\n };\n\n const receivedChunkTooSmall =\n receivedShape.x < chunk.shape.x ||\n receivedShape.y < chunk.shape.y ||\n receivedShape.z < chunk.shape.z;\n\n if (receivedChunkTooSmall) {\n throw new Error(\n `Received incompatible shape for chunkIndex ${JSON.stringify(chunk.chunkIndex)} at LOD ${chunk.lod}: ` +\n `expected shape: ${JSON.stringify(chunk.shape)}, received shape: ${JSON.stringify(receivedShape)} (too small)`\n );\n }\n\n const receivedChunkHasPadding =\n receivedShape.x > chunk.shape.x ||\n receivedShape.y > chunk.shape.y ||\n receivedShape.z > chunk.shape.z;\n\n if (receivedChunkHasPadding) {\n chunk.data = this.trimChunkPadding(\n chunk,\n receivedChunk.data,\n receivedChunk.stride\n );\n } else {\n chunk.data = receivedChunk.data;\n }\n\n const rowAlignment = chunk.data.BYTES_PER_ELEMENT;\n if (!isTextureUnpackRowAlignment(rowAlignment)) {\n throw new Error(\n \"Invalid row alignment value. Possible values are 1, 2, 4, or 8\"\n );\n }\n chunk.rowAlignmentBytes = rowAlignment;\n }\n\n private trimChunkPadding(\n chunk: Chunk,\n receivedChunkData: ChunkData,\n receivedChunkStride: number[]\n ): ChunkData {\n const compactSize = chunk.shape.x * chunk.shape.y * chunk.shape.z;\n const compactData =\n new (receivedChunkData.constructor as ChunkDataConstructor)(compactSize);\n\n let offset = 0;\n const zStride = this.dimensions_.z\n ? receivedChunkStride[this.dimensions_.z.index]\n : 0;\n const yStride = receivedChunkStride[this.dimensions_.y.index];\n for (let z = 0; z < chunk.shape.z; z++) {\n const zStart = z * zStride;\n for (let y = 0; y < chunk.shape.y; y++) {\n const srcStart = zStart + y * yStride;\n const srcEnd = srcStart + chunk.shape.x;\n compactData.set(receivedChunkData.subarray(srcStart, srcEnd), offset);\n offset += chunk.shape.x;\n }\n }\n return compactData;\n }\n\n public async loadRegion(\n region: Region,\n lod: number,\n scheduler?: PromiseScheduler\n ): Promise<Chunk> {\n if (lod >= this.arrays_.length) {\n throw new Error(\n `Invalid LOD index: ${lod}. Only ${this.arrays_.length} lod(s) available`\n );\n }\n\n const indices = this.regionToIndices(region, lod);\n\n const array = this.arrays_[lod];\n\n let options = {};\n if (scheduler !== undefined) {\n options = {\n create_queue: () => new PromiseQueue(scheduler),\n opts: { signal: scheduler.abortSignal },\n };\n }\n const subarray = await zarr.get(array, indices, options);\n\n if (!isChunkData(subarray.data)) {\n throw new Error(\n `Subarray has an unsupported data type, data=${subarray.data.constructor.name}`\n );\n }\n\n validateTightlyPackedChunk(subarray);\n\n if (subarray.shape.length !== 2 && subarray.shape.length !== 3) {\n throw new Error(\n `Expected to receive a 2D or 3D subarray. Instead chunk has shape ${subarray.shape}`\n );\n }\n\n const rowAlignment = subarray.data.BYTES_PER_ELEMENT;\n if (!isTextureUnpackRowAlignment(rowAlignment)) {\n throw new Error(\n \"Invalid row alignment value. Possible values are 1, 2, 4, or 8\"\n );\n }\n\n const calculateOffset = (\n index: number | Slice,\n lod: SourceDimensionLod\n ) => {\n if (typeof index === \"number\") {\n return index * lod.scale + lod.translation;\n } else if (index.start === null) {\n return lod.translation;\n }\n return index.start * lod.scale + lod.translation;\n };\n\n const xLod = this.dimensions_.x.lods[lod];\n const xIndex = indices[this.dimensions_.x.index];\n const xOffset = calculateOffset(xIndex, xLod);\n const yIndex = indices[this.dimensions_.y.index];\n const yLod = this.dimensions_.y.lods[lod];\n const yOffset = calculateOffset(yIndex, yLod);\n\n const chunk: Chunk = {\n state: \"loaded\",\n lod: lod,\n visible: true,\n prefetch: false,\n priority: null,\n orderKey: null,\n data: subarray.data,\n shape: {\n x: subarray.shape[subarray.shape.length - 1],\n y: subarray.shape[subarray.shape.length - 2],\n z: 1,\n c: subarray.shape.length === 3 ? subarray.shape[0] : 1,\n },\n chunkIndex: { x: 0, y: 0, z: 0, c: 0, t: 0 },\n rowAlignmentBytes: rowAlignment,\n scale: {\n x: xLod.scale,\n y: yLod.scale,\n z: 1,\n },\n offset: { x: xOffset, y: yOffset, z: 0 },\n };\n return chunk;\n }\n\n private regionToIndices(region: Region, lod: number): Array<Slice | number> {\n const dimensions = [\n this.dimensions_.x,\n this.dimensions_.y,\n this.dimensions_.z,\n this.dimensions_.c,\n this.dimensions_.t,\n ]\n .filter((d): d is SourceDimension => d !== undefined)\n .sort((a, b) => a.index - b.index);\n\n const indices: Array<Slice | number> = [];\n for (const d of dimensions) {\n const match = region.find((s) => compareDimensions(s.dimension, d.name));\n if (!match) {\n throw new Error(`Region does not contain a slice for ${d.name}`);\n }\n const dLod = d.lods[lod];\n let index: Slice | number;\n const regionIndex = match.index;\n if (regionIndex.type === \"full\") {\n // null slice is the complete extent of a dimension like Python's `slice(None)`.\n index = zarr.slice(null);\n } else if (regionIndex.type === \"point\") {\n index = Math.round((regionIndex.value - dLod.translation) / dLod.scale);\n } else {\n index = zarr.slice(\n Math.floor((regionIndex.start - dLod.translation) / dLod.scale),\n Math.ceil((regionIndex.stop - dLod.translation) / dLod.scale)\n );\n }\n indices.push(index);\n }\n return indices;\n }\n}\n\nfunction inferSourceDimensionMap(\n image: OmeZarrImage[\"ome\"][\"multiscales\"][number],\n arrays: ReadonlyArray<zarr.Array<zarr.DataType, Readable>>\n): SourceDimensionMap {\n const dimensionNames = image.axes.map((axis) => axis.name);\n const numAxes = image.axes.length;\n\n const xIndex = findDimensionIndex(dimensionNames, \"x\");\n const yIndex = findDimensionIndex(dimensionNames, \"y\");\n\n const makeSourceDimension = (\n name: string,\n index: number\n ): SourceDimension => {\n const lods = [];\n for (let i = 0; i < image.datasets.length; i++) {\n const dataset = image.datasets[i];\n const array = arrays[i];\n const scale = dataset.coordinateTransformations[0].scale;\n const translation =\n dataset.coordinateTransformations.length === 2\n ? dataset.coordinateTransformations[1].translation\n : new Array(numAxes).fill(0);\n lods.push({\n size: array.shape[index],\n chunkSize: array.chunks[index],\n scale: scale[index],\n translation: translation[index],\n });\n }\n return {\n name,\n index,\n unit: image.axes[index].unit,\n lods,\n };\n };\n\n const dims: SourceDimensionMap = {\n x: makeSourceDimension(dimensionNames[xIndex], xIndex),\n y: makeSourceDimension(dimensionNames[yIndex], yIndex),\n numLods: arrays.length,\n };\n\n const zIndex = findDimensionIndexSafe(dimensionNames, \"z\");\n if (zIndex !== -1) {\n dims.z = makeSourceDimension(dimensionNames[zIndex], zIndex);\n }\n\n const cIndex = findDimensionIndexSafe(dimensionNames, \"c\");\n if (cIndex !== -1) {\n dims.c = makeSourceDimension(dimensionNames[cIndex], cIndex);\n }\n\n const tIndex = findDimensionIndexSafe(dimensionNames, \"t\");\n if (tIndex !== -1) {\n dims.t = makeSourceDimension(dimensionNames[tIndex], tIndex);\n }\n\n return dims;\n}\n\nfunction compareDimensions(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\nfunction findDimensionIndex(dimensions: string[], target: string): number {\n const index = findDimensionIndexSafe(dimensions, target);\n if (index === -1) {\n throw new Error(\n `Could not find \"${target}\" dimension in [${dimensions.join(\", \")}]`\n );\n }\n return index;\n}\n\nfunction findDimensionIndexSafe(dimensions: string[], target: string): number {\n return dimensions.findIndex((d) => compareDimensions(d, target));\n}\n\nfunction validateTightlyPackedChunk(chunk: zarr.Chunk<zarr.DataType>): void {\n let stride = 1;\n for (let i = chunk.shape.length - 1; i >= 0; i--) {\n if (chunk.stride[i] !== stride) {\n throw new Error(\n `Chunk data is not tightly packed, stride=${JSON.stringify(chunk.stride)}, shape=${JSON.stringify(chunk.shape)}`\n );\n }\n stride *= chunk.shape[i];\n }\n}\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === errorMap ? undefined : errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" &&\n (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nvar _ZodEnum_cache, _ZodNativeEnum_cache;\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n var _a, _b;\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message !== null && message !== void 0 ? message : ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if ((_b = (_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === null || _b === void 0 ? void 0 : _b.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n // let regex = `\\\\d{2}:\\\\d{2}:\\\\d{2}`;\n let regex = `([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d`;\n if (args.precision) {\n regex = `${regex}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n regex = `${regex}(\\\\.\\\\d+)?`;\n }\n return regex;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (!decoded.typ || !decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a, _b;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch (_a) {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodEnum_cache.set(this, void 0);\n }\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodEnum_cache, \"f\").has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\n_ZodEnum_cache = new WeakMap();\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n constructor() {\n super(...arguments);\n _ZodNativeEnum_cache.set(this, void 0);\n }\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\")) {\n __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), \"f\");\n }\n if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, \"f\").has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\n_ZodNativeEnum_cache = new WeakMap();\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nclass ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result)\n ? result.then((data) => freeze(data))\n : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nfunction custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n var _a, _b;\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = (_b = (_a = params.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = (_b = (_a = params.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n datetimeRegex: datetimeRegex,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n ZodReadonly: ZodReadonly,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodReadonly, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, datetimeRegex, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","import { z } from \"zod\";\n\n/**JSON from OME-NGFF .zattrs*/\nexport const Image = z\n .object({\n /**The multiscale datasets for this image*/\n multiscales: z\n .array(\n z.object({\n name: z.string().optional(),\n datasets: z\n .array(\n z.object({\n path: z.string(),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1),\n })\n )\n .min(1),\n version: z.literal(\"0.4\").optional(),\n axes: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n name: z.string(),\n type: z.enum([\"channel\", \"time\", \"space\"]),\n }),\n z.object({\n name: z.string(),\n type: z\n .any()\n .refine(\n (value) =>\n !z.enum([\"space\", \"time\", \"channel\"]).safeParse(value)\n .success,\n \"Invalid input: Should NOT be valid against schema\"\n )\n .optional(),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(2)\n .max(5),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n // The JSON schema and my reading of the spec is that while\n // identity is a valid transformation, it cannot be used here.\n // However, some writers write it (e.g iohub), and it has no\n // effect on the overall transformation, so we manually added\n // after generation from the schema.\n // See the following PR for more context:\n // https://github.com/ome/ngff/pull/152\n z.object({\n type: z.literal(\"identity\"),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1)\n .optional(),\n })\n )\n .min(1)\n .describe(\"The multiscale datasets for this image\"),\n omero: z\n .object({\n channels: z.array(\n z.object({\n window: z.object({\n end: z.number(),\n max: z.number(),\n min: z.number(),\n start: z.number(),\n }),\n label: z.string().optional(),\n family: z.string().optional(),\n color: z.string(),\n active: z.boolean().optional(),\n })\n ),\n // The rdefs are not in the JSON schema and are not particularly well\n // described by the specification, but are written by some tools\n // (e.g. iohub), so we manually add them.\n // See the OMERO docs for more information:\n // https://docs.openmicroscopy.org/omero/5.6.1/developers/Web/WebGateway.html#rendering-settings\n rdefs: z\n .object({\n defaultT: z.number().optional(),\n defaultZ: z.number().optional(),\n color: z.enum([\"color\", \"greyscale\"]).optional(),\n projection: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .describe(\"JSON from OME-NGFF .zattrs\");\nexport type Image = z.infer<typeof Image>;\n","import { z } from \"zod\";\n\n/**JSON from OME-NGFF .zattrs*/\nexport const Plate = z\n .object({\n plate: z\n .object({\n /**The acquisitions for this plate*/\n acquisitions: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n id: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"A unique identifier within the context of the plate\"\n ),\n /**The maximum number of fields of view for the acquisition*/\n maximumfieldcount: z\n .number()\n .int()\n .gt(0)\n .describe(\n \"The maximum number of fields of view for the acquisition\"\n )\n .optional(),\n /**The name of the acquisition*/\n name: z\n .string()\n .describe(\"The name of the acquisition\")\n .optional(),\n /**The description of the acquisition*/\n description: z\n .string()\n .describe(\"The description of the acquisition\")\n .optional(),\n /**The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n starttime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n /**The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n endtime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n })\n )\n .describe(\"The acquisitions for this plate\")\n .optional(),\n /**The version of the specification*/\n version: z\n .literal(\"0.4\")\n .describe(\"The version of the specification\")\n .optional(),\n /**The maximum number of fields per view across all wells*/\n field_count: z\n .number()\n .int()\n .gt(0)\n .describe(\"The maximum number of fields per view across all wells\")\n .optional(),\n /**The name of the plate*/\n name: z.string().describe(\"The name of the plate\").optional(),\n /**The columns of the plate*/\n columns: z\n .array(\n z.object({\n /**The column name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The column name\"),\n })\n )\n .min(1)\n .describe(\"The columns of the plate\"),\n /**The rows of the plate*/\n rows: z\n .array(\n z.object({\n /**The row name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The row name\"),\n })\n )\n .min(1)\n .describe(\"The rows of the plate\"),\n /**The wells of the plate*/\n wells: z\n .array(\n z.object({\n /**The path to the well subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+/[A-Za-z0-9]+$\"))\n .describe(\"The path to the well subgroup\"),\n /**The index of the well in the rows list*/\n rowIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the rows list\"),\n /**The index of the well in the columns list*/\n columnIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the columns list\"),\n })\n )\n .min(1)\n .describe(\"The wells of the plate\"),\n })\n .optional(),\n })\n .describe(\"JSON from OME-NGFF .zattrs\");\nexport type Plate = z.infer<typeof Plate>;\n","import { z } from \"zod\";\n\n/**JSON from OME-NGFF .zattrs*/\nexport const Well = z\n .object({\n well: z\n .object({\n /**The fields of view for this well*/\n images: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n acquisition: z\n .number()\n .int()\n .describe(\"A unique identifier within the context of the plate\")\n .optional(),\n /**The path for this field of view subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The path for this field of view subgroup\"),\n })\n )\n .min(1)\n .describe(\"The fields of view for this well\"),\n /**The version of the specification*/\n version: z\n .literal(\"0.4\")\n .describe(\"The version of the specification\")\n .optional(),\n })\n .optional(),\n })\n .describe(\"JSON from OME-NGFF .zattrs\");\nexport type Well = z.infer<typeof Well>;\n","import { z } from \"zod\";\n\n/**The zarr.json attributes key*/\nexport const Image = z\n .object({\n /**The versioned OME-Zarr Metadata namespace*/\n ome: z\n .object({\n /**The multiscale datasets for this image*/\n multiscales: z\n .array(\n z.object({\n name: z.string().optional(),\n datasets: z\n .array(\n z.object({\n path: z.string(),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error\n ? [...errors, result.error]\n : errors)(schema.safeParse(x)),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message:\n \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1),\n })\n )\n .min(1),\n axes: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n name: z.string(),\n type: z.enum([\"channel\", \"time\", \"space\"]),\n }),\n z.object({\n name: z.string(),\n type: z\n .any()\n .refine(\n (value) =>\n !z\n .enum([\"space\", \"time\", \"channel\"])\n .safeParse(value).success,\n \"Invalid input: Should NOT be valid against schema\"\n )\n .optional(),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(2)\n .max(5),\n coordinateTransformations: z\n .array(\n z.any().superRefine((x, ctx) => {\n const schemas = [\n z.object({\n type: z.literal(\"scale\"),\n scale: z.array(z.number()).min(2),\n }),\n z.object({\n type: z.literal(\"translation\"),\n translation: z.array(z.number()).min(2),\n }),\n // The JSON schema and my reading of the spec is that while\n // identity is a valid transformation, it cannot be used here.\n // However, some writers write it (e.g iohub), and it has no\n // effect on the overall transformation, so we manually added\n // after generation from the schema.\n // See the following PR for more context:\n // https://github.com/ome/ngff/pull/152\n z.object({\n type: z.literal(\"identity\"),\n }),\n ];\n const errors = schemas.reduce<z.ZodError[]>(\n (errors, schema) =>\n ((result) =>\n result.error ? [...errors, result.error] : errors)(\n schema.safeParse(x)\n ),\n []\n );\n if (schemas.length - errors.length !== 1) {\n ctx.addIssue({\n path: ctx.path,\n code: \"invalid_union\",\n unionErrors: errors,\n message: \"Invalid input: Should pass single schema\",\n });\n }\n })\n )\n .min(1)\n .optional(),\n })\n )\n .min(1)\n .describe(\"The multiscale datasets for this image\"),\n omero: z\n .object({\n channels: z.array(\n z.object({\n window: z\n .object({\n end: z.number(),\n max: z.number(),\n min: z.number(),\n start: z.number(),\n })\n .optional(),\n label: z.string().optional(),\n family: z.string().optional(),\n color: z.string().optional(),\n active: z.boolean().optional(),\n })\n ),\n // The rdefs are not in the JSON schema and are not particularly well\n // described by the specification, but are written by some tools\n // (e.g. iohub), so we manually add them.\n // See the OMERO docs for more information:\n // https://docs.openmicroscopy.org/omero/5.6.1/developers/Web/WebGateway.html#rendering-settings\n rdefs: z\n .object({\n defaultT: z.number().optional(),\n defaultZ: z.number().optional(),\n color: z.enum([\"color\", \"greyscale\"]).optional(),\n projection: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n /**The version of the OME-Zarr Metadata*/\n version: z\n .literal(\"0.5\")\n .describe(\"The version of the OME-Zarr Metadata\"),\n })\n .describe(\"The versioned OME-Zarr Metadata namespace\"),\n })\n .describe(\"The zarr.json attributes key\");\nexport type Image = z.infer<typeof Image>;\n","import { z } from \"zod\";\n\n/**The zarr.json attributes key*/\nexport const Plate = z\n .object({\n /**The versioned OME-Zarr Metadata namespace*/\n ome: z\n .object({\n plate: z.object({\n /**The acquisitions for this plate*/\n acquisitions: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n id: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"A unique identifier within the context of the plate\"\n ),\n /**The maximum number of fields of view for the acquisition*/\n maximumfieldcount: z\n .number()\n .int()\n .gt(0)\n .describe(\n \"The maximum number of fields of view for the acquisition\"\n )\n .optional(),\n /**The name of the acquisition*/\n name: z\n .string()\n .describe(\"The name of the acquisition\")\n .optional(),\n /**The description of the acquisition*/\n description: z\n .string()\n .describe(\"The description of the acquisition\")\n .optional(),\n /**The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n starttime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The start timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n /**The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch*/\n endtime: z\n .number()\n .int()\n .gte(0)\n .describe(\n \"The end timestamp of the acquisition, expressed as epoch time i.e. the number seconds since the Epoch\"\n )\n .optional(),\n })\n )\n .describe(\"The acquisitions for this plate\")\n .optional(),\n /**The maximum number of fields per view across all wells*/\n field_count: z\n .number()\n .int()\n .gt(0)\n .describe(\"The maximum number of fields per view across all wells\")\n .optional(),\n /**The name of the plate*/\n name: z.string().describe(\"The name of the plate\").optional(),\n /**The columns of the plate*/\n columns: z\n .array(\n z.object({\n /**The column name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The column name\"),\n })\n )\n .min(1)\n .describe(\"The columns of the plate\"),\n /**The rows of the plate*/\n rows: z\n .array(\n z.object({\n /**The row name*/\n name: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The row name\"),\n })\n )\n .min(1)\n .describe(\"The rows of the plate\"),\n /**The wells of the plate*/\n wells: z\n .array(\n z.object({\n /**The path to the well subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+/[A-Za-z0-9]+$\"))\n .describe(\"The path to the well subgroup\"),\n /**The index of the well in the rows list*/\n rowIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the rows list\"),\n /**The index of the well in the columns list*/\n columnIndex: z\n .number()\n .int()\n .gte(0)\n .describe(\"The index of the well in the columns list\"),\n })\n )\n .min(1)\n .describe(\"The wells of the plate\"),\n }),\n /**The version of the OME-Zarr Metadata*/\n version: z\n .literal(\"0.5\")\n .describe(\"The version of the OME-Zarr Metadata\"),\n })\n .describe(\"The versioned OME-Zarr Metadata namespace\"),\n })\n .describe(\"The zarr.json attributes key\");\nexport type Plate = z.infer<typeof Plate>;\n","import { z } from \"zod\";\n\n/**JSON from OME-Zarr zarr.json*/\nexport const Well = z\n .object({\n /**The versioned OME-Zarr Metadata namespace*/\n ome: z\n .object({\n well: z.object({\n /**The fields of view for this well*/\n images: z\n .array(\n z.object({\n /**A unique identifier within the context of the plate*/\n acquisition: z\n .number()\n .int()\n .describe(\n \"A unique identifier within the context of the plate\"\n )\n .optional(),\n /**The path for this field of view subgroup*/\n path: z\n .string()\n .regex(new RegExp(\"^[A-Za-z0-9]+$\"))\n .describe(\"The path for this field of view subgroup\"),\n })\n )\n .min(1)\n .describe(\"The fields of view for this well\"),\n }),\n /**The version of the OME-Zarr Metadata*/\n version: z\n .literal(\"0.5\")\n .describe(\"The version of the OME-Zarr Metadata\"),\n })\n .describe(\"The versioned OME-Zarr Metadata namespace\"),\n })\n .describe(\"JSON from OME-Zarr zarr.json\");\nexport type Well = z.infer<typeof Well>;\n","import * as zarr from \"zarrita\";\nimport { Image as ImageV04 } from \"./0.4/image\";\nimport { Plate as PlateV04 } from \"./0.4/plate\";\nimport { Well as WellV04 } from \"./0.4/well\";\nimport { Image } from \"./0.5/image\";\nimport { Plate } from \"./0.5/plate\";\nimport { Well } from \"./0.5/well\";\nimport { OmeZarrImageSource } from \"./image_source\";\nimport { Version as ZarrVersion, openGroup } from \"../zarr/open\";\n\nconst versions = [\"0.4\", \"0.5\"] as const;\nconst versionsSet: ReadonlySet<string> = new Set(versions);\nexport type Version = (typeof versions)[number];\n\ntype AdaptedOme<T> = T & {\n originalVersion: Version;\n};\n\nfunction maybeGetVersion(attrs: object): Version | undefined {\n if (!(\"ome\" in attrs)) return;\n if (!(attrs.ome instanceof Object)) return;\n const ome = attrs.ome;\n if (!(\"version\" in ome)) return;\n if (typeof ome.version !== \"string\") return;\n if (!versionsSet.has(ome.version)) return;\n return ome.version as Version;\n}\n\nfunction getVersion(attrs: object): Version {\n // From v0.5 onwards, we assume that ome.version indicates the version.\n // If it is not present or malformed, we assume it is v0.4, which is\n // the oldest format we support.\n const version = maybeGetVersion(attrs);\n if (version === undefined) return \"0.4\";\n return version;\n}\n\nexport function omeZarrToZarrVersion(\n omeVersion: Version | undefined\n): ZarrVersion | undefined {\n if (omeVersion === undefined) return undefined;\n switch (omeVersion) {\n case \"0.4\":\n return \"v2\";\n case \"0.5\":\n return \"v3\";\n }\n}\n\nfunction removeProperty<O, P extends keyof O>(obj: O, prop: P): Omit<O, P> {\n const objCopy = { ...obj };\n delete objCopy[prop];\n return objCopy;\n}\n\nexport async function loadOmeZarrPlate(\n url: string,\n version?: Version\n): Promise<AdaptedOme<Plate[\"ome\"]>> {\n const location = new zarr.Location(new zarr.FetchStore(url));\n const zarrVersion = omeZarrToZarrVersion(version);\n const group = await openGroup(location, zarrVersion);\n try {\n return parsePlate(group.attrs);\n } catch {\n throw Error(\n `Failed to parse OME-Zarr plate:\\n${JSON.stringify(group.attrs)}`\n );\n }\n}\n\nfunction parsePlate(attrs: Record<string, unknown>): AdaptedOme<Plate[\"ome\"]> {\n const version = getVersion(attrs);\n switch (version) {\n case \"0.5\":\n return {\n ...Plate.parse(attrs).ome,\n originalVersion: \"0.5\",\n };\n case \"0.4\":\n return {\n ...adaptPlateV04ToV05(PlateV04.parse(attrs)).ome,\n originalVersion: \"0.4\",\n };\n }\n}\n\nfunction adaptPlateV04ToV05(platev04: PlateV04): Plate {\n if (platev04.plate === undefined) {\n throw new Error(\"Plate metadata is missing in OME-Zarr v0.4 plate\");\n }\n const plate = removeProperty(platev04.plate, \"version\");\n return {\n ome: {\n plate,\n version: \"0.5\",\n },\n };\n}\n\nfunction adaptWellV04ToV05(wellv04: WellV04): Well {\n if (wellv04.well === undefined) {\n throw new Error(\"Well metadata is missing in OME-Zarr v0.4 well\");\n }\n const well = removeProperty(wellv04.well, \"version\");\n return {\n ome: {\n well,\n version: \"0.5\",\n },\n };\n}\n\nfunction parseWell(attrs: Record<string, unknown>): AdaptedOme<Well[\"ome\"]> {\n const version = getVersion(attrs);\n switch (version) {\n case \"0.5\":\n return {\n ...Well.parse(attrs).ome,\n originalVersion: \"0.5\",\n };\n case \"0.4\":\n return {\n ...adaptWellV04ToV05(WellV04.parse(attrs)).ome,\n originalVersion: \"0.4\",\n };\n }\n}\n\nexport async function loadOmeZarrWell(\n url: string,\n path: string,\n version?: Version\n): Promise<AdaptedOme<Well[\"ome\"]>> {\n const location = new zarr.Location(new zarr.FetchStore(url + \"/\" + path));\n const zarrVersion = omeZarrToZarrVersion(version);\n const group = await openGroup(location, zarrVersion);\n try {\n return parseWell(group.attrs);\n } catch {\n throw Error(\n `Failed to parse OME-Zarr well:\\n${JSON.stringify(group.attrs)}`\n );\n }\n}\n\nexport type OmeroMetadata = NonNullable<Image[\"ome\"][\"omero\"]>;\nexport type OmeroChannel = OmeroMetadata[\"channels\"][number];\n\nexport async function loadOmeroChannels(\n source: OmeZarrImageSource\n): Promise<OmeroChannel[]> {\n const zarrVersion = omeZarrToZarrVersion(source.version);\n const group = await openGroup(source.location, zarrVersion);\n const image = parseOmeZarrImage(group.attrs);\n return image.omero?.channels ?? [];\n}\n\nexport async function loadOmeroDefaults(\n source: OmeZarrImageSource\n): Promise<OmeroMetadata[\"rdefs\"]> {\n const zarrVersion = omeZarrToZarrVersion(source.version);\n const group = await openGroup(source.location, zarrVersion);\n const image = parseOmeZarrImage(group.attrs);\n return image.omero?.rdefs;\n}\n\nfunction adaptImageV04ToV05(imagev04: ImageV04): Image {\n return {\n ome: {\n multiscales: imagev04.multiscales,\n omero: imagev04.omero,\n version: \"0.5\",\n },\n };\n}\n\nfunction parseImage(attrs: Record<string, unknown>): AdaptedOme<Image[\"ome\"]> {\n const version = getVersion(attrs);\n switch (version) {\n case \"0.5\":\n return {\n ...Image.parse(attrs).ome,\n originalVersion: \"0.5\",\n };\n case \"0.4\":\n return {\n ...adaptImageV04ToV05(ImageV04.parse(attrs)).ome,\n originalVersion: \"0.4\",\n };\n }\n}\n\nexport function parseOmeZarrImage(\n attrs: Record<string, unknown>\n): AdaptedOme<Image[\"ome\"]> {\n try {\n return parseImage(attrs);\n } catch {\n throw Error(`Failed to parse OME-Zarr image:\\n${JSON.stringify(attrs)}`);\n }\n}\n","import { Location } from \"@zarrita/core\";\nimport { Readable } from \"@zarrita/storage\";\nimport FetchStore from \"@zarrita/storage/fetch\";\nimport {\n openArrayFromParams,\n openGroup,\n createZarrArrayParams,\n} from \"../zarr/open\";\nimport WebFileSystemStore from \"../zarr/web_file_system_store\";\nimport { OmeZarrImageLoader } from \"./image_loader\";\nimport {\n omeZarrToZarrVersion,\n parseOmeZarrImage,\n Version as OmeZarrVersion,\n} from \"./metadata_loaders\";\n\n/** Opens an OME-Zarr multiscale image Zarr group from either a URL or local directory. */\nexport class OmeZarrImageSource {\n readonly location: Location<Readable>;\n readonly version?: OmeZarrVersion;\n\n /**\n * @param url URL of Zarr root\n */\n constructor(url: string, version?: OmeZarrVersion);\n /**\n * @param directory return value of `window.showDirectoryPicker()` which gives the browser\n * permission to access a directory (only works in Chrome/Edge)\n * @param path path to image, beginning with \"/\". This argument allows the application to only\n * ask the user once for permission to the root directory\n */\n constructor(\n directory: FileSystemDirectoryHandle,\n version?: OmeZarrVersion,\n path?: `/${string}`\n );\n constructor(\n source: string | FileSystemDirectoryHandle,\n version?: OmeZarrVersion,\n path?: `/${string}`\n ) {\n this.location =\n typeof source === \"string\"\n ? new Location(new FetchStore(source))\n : new Location(new WebFileSystemStore(source), path);\n this.version = version;\n }\n\n public async open(): Promise<OmeZarrImageLoader> {\n let zarrVersion = omeZarrToZarrVersion(this.version);\n const root = await openGroup(this.location, zarrVersion);\n const adaptedOmeImage = parseOmeZarrImage(root.attrs);\n const images = adaptedOmeImage.multiscales;\n if (images.length !== 1) {\n throw new Error(\n `Exactly one multiscale image is supported. Found ${images.length} images.`\n );\n }\n const metadata = images[0];\n if (metadata.datasets.length === 0) {\n throw new Error(`No datasets found in the multiscale image.`);\n }\n if (!zarrVersion) {\n zarrVersion = omeZarrToZarrVersion(adaptedOmeImage.originalVersion);\n }\n const arrayParams = metadata.datasets.map((d) =>\n createZarrArrayParams(this.location, d.path, zarrVersion)\n );\n const arrays = await Promise.all(\n arrayParams.map((params) => openArrayFromParams(params))\n );\n\n const shape = arrays[0].shape;\n const axes = metadata.axes;\n if (axes.length !== shape.length) {\n throw new Error(\n `Mismatch between number of axes (${axes.length}) and array shape (${shape.length})`\n );\n }\n return new OmeZarrImageLoader({\n metadata,\n arrays,\n arrayParams,\n });\n }\n}\n","const ALL_CATEGORIES = [\n \"fallbackVisible\",\n \"prefetchTime\",\n \"visibleCurrent\",\n \"fallbackBackground\",\n \"prefetchSpace\",\n] as const;\n\nexport type PriorityCategory = (typeof ALL_CATEGORIES)[number];\n\nexport type ImageSourcePolicyConfig = {\n profile?: string;\n prefetch: {\n x: number;\n y: number;\n z?: number;\n t?: number;\n };\n priorityOrder: PriorityCategory[];\n lod?: {\n min?: number;\n max?: number;\n bias?: number;\n };\n};\n\nexport type ImageSourcePolicy = Readonly<{\n profile: string;\n prefetch: {\n x: number;\n y: number;\n z: number;\n t: number;\n };\n priorityOrder: readonly PriorityCategory[];\n priorityMap: Readonly<Record<PriorityCategory, number>>;\n lod: {\n min: number;\n max: number;\n bias: number;\n };\n}>;\n\nexport function createImageSourcePolicy(\n config: ImageSourcePolicyConfig\n): ImageSourcePolicy {\n validatePolicyConfig(config);\n\n const prefetch = {\n x: config.prefetch.x,\n y: config.prefetch.y,\n z: config.prefetch.z ?? 0,\n t: config.prefetch.t ?? 0,\n };\n\n const priorityMap: Readonly<Record<PriorityCategory, number>> = Object.freeze(\n ALL_CATEGORIES.reduce<Record<PriorityCategory, number>>(\n (acc, cat) => {\n const idx = config.priorityOrder.indexOf(cat);\n acc[cat] = idx;\n return acc;\n },\n {} as Record<PriorityCategory, number>\n )\n );\n\n const lod = {\n min: config.lod?.min ?? 0,\n max: config.lod?.max ?? Number.MAX_SAFE_INTEGER,\n bias: config.lod?.bias ?? 0.5,\n };\n\n const resolved: ImageSourcePolicy = {\n profile: config.profile ?? \"custom\",\n prefetch,\n priorityOrder: Object.freeze([...config.priorityOrder]),\n priorityMap,\n lod,\n };\n\n return Object.freeze(resolved);\n}\n\nexport function createExplorationPolicy(\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicy {\n const base: ImageSourcePolicyConfig = {\n profile: \"exploration\",\n prefetch: { x: 1, y: 1, z: 1, t: 0 },\n priorityOrder: [\n \"fallbackVisible\",\n \"visibleCurrent\",\n \"prefetchSpace\",\n \"prefetchTime\",\n \"fallbackBackground\",\n ],\n };\n return createImageSourcePolicy(mergeConfig(base, overrides));\n}\n\nexport function createPlaybackPolicy(\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicy {\n const base: ImageSourcePolicyConfig = {\n profile: \"playback\",\n prefetch: { x: 0, y: 0, z: 0, t: 20 },\n priorityOrder: [\n \"fallbackVisible\",\n \"prefetchTime\",\n \"visibleCurrent\",\n \"fallbackBackground\",\n \"prefetchSpace\",\n ],\n };\n return createImageSourcePolicy(mergeConfig(base, overrides));\n}\n\nexport function createNoPrefetchPolicy(\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicy {\n const base: ImageSourcePolicyConfig = {\n profile: \"no-prefetch\",\n prefetch: { x: 0, y: 0, z: 0, t: 0 },\n priorityOrder: [\n \"fallbackVisible\",\n \"visibleCurrent\",\n \"fallbackBackground\",\n \"prefetchSpace\",\n \"prefetchTime\",\n ],\n };\n return createImageSourcePolicy(mergeConfig(base, overrides));\n}\n\nfunction validatePolicyConfig(config: ImageSourcePolicyConfig) {\n for (const [k, v] of Object.entries(config.prefetch)) {\n if (v === undefined) continue; // z/t may be omitted\n if (v < 0) {\n throw new Error(`prefetch.${k} must be a non-negative number`);\n }\n }\n\n const lod = config.lod;\n if (lod?.min !== undefined && lod?.max !== undefined && lod.min > lod.max) {\n throw new Error(`lod.min must be <= lod.max`);\n }\n\n const order = config.priorityOrder;\n if (\n order.length !== ALL_CATEGORIES.length ||\n new Set(order).size !== order.length\n ) {\n throw new Error(`priorityOrder must include all categories exactly once`);\n }\n}\n\nfunction mergeConfig(\n base: ImageSourcePolicyConfig,\n overrides: Partial<ImageSourcePolicyConfig> = {}\n): ImageSourcePolicyConfig {\n return {\n profile: overrides.profile ?? base.profile,\n prefetch: { ...base.prefetch, ...(overrides.prefetch ?? {}) },\n lod: { ...base.lod, ...(overrides.lod ?? {}) },\n priorityOrder: overrides.priorityOrder ?? base.priorityOrder,\n };\n}\n","import { vec3 } from \"gl-matrix\";\n\nexport class Spherical {\n public radius;\n public phi;\n public theta;\n\n constructor(radius: number, phi: number, theta: number) {\n this.radius = radius;\n this.phi = phi;\n this.theta = theta;\n }\n\n public toVec3() {\n const c = Math.cos(this.theta);\n return vec3.fromValues(\n this.radius * Math.sin(this.phi) * c,\n -this.radius * Math.sin(this.theta),\n this.radius * Math.cos(this.phi) * c\n );\n }\n}\n","import { vec3 } from \"gl-matrix\";\n\nimport { Color } from \"../../core/color\";\nimport { RenderableObject } from \"../../core/renderable_object\";\nimport { Texture2DArray } from \"../textures/texture_2d_array\";\nimport { Geometry } from \"../../core/geometry\";\n\n// TODO: add a border (or \"secondary\") color to improve contrast against background\ntype PointProperties = {\n position: vec3;\n color: Color;\n size: number;\n markerIndex: number;\n};\n\nexport class Points extends RenderableObject {\n private atlas_: Texture2DArray;\n\n constructor(points: PointProperties[], markerAtlas: Texture2DArray) {\n super();\n this.programName = \"points\";\n this.atlas_ = markerAtlas;\n\n points.forEach((point) => {\n const marker = point.markerIndex;\n if (marker < 0 || marker >= this.atlas_.depth) {\n throw new Error(\n `Markers must be in the range [0, ${this.atlas_.depth - 1}] (number of markers in atlas)`\n );\n }\n });\n\n const vertexData = points.flatMap((point) => [\n point.position[0],\n point.position[1],\n point.position[2],\n point.color.r,\n point.color.g,\n point.color.b,\n point.color.a,\n point.size,\n point.markerIndex,\n ]);\n const geometry = new Geometry(vertexData, [], \"points\");\n\n geometry.addAttribute({\n type: \"position\",\n itemSize: 3,\n offset: 0,\n });\n geometry.addAttribute({\n type: \"color\",\n itemSize: 4,\n offset: geometry.strideBytes,\n });\n geometry.addAttribute({\n type: \"size\",\n itemSize: 1,\n offset: geometry.strideBytes,\n });\n geometry.addAttribute({\n type: \"marker\",\n itemSize: 1,\n offset: geometry.strideBytes,\n });\n\n this.geometry = geometry;\n this.setTexture(0, this.atlas_);\n }\n\n public get type() {\n return \"Points\";\n }\n}\n"],"names":["Color","r","g","b","a","colorLike","hex","result","value","Renderer","canvas","color","projected_line_vert_default","projected_line_frag_default","mesh_vert_default","scalar_image_frag_default","scalar_image_array_frag_default","points_vert_default","points_frag_default","wireframe_vert_default","wireframe_frag_default","volume_vert_default","volume_frag_default","label_image_frag_default","shaderCode","projectedLineVertexShader","projectedLineFragmentShader","pointsVertexShader","pointsFragmentShader","wireframeVertexShader","wireframeFragmentShader","meshVertexShader","scalarImageFragmentShader","scalarImageArrayFragmentShader","labelImage","volumeVertexShader","volumeFragmentShader","Levels","Colors","getMode","nodeEnv","NODE_ENV","Logger","level","moduleName","message","params","args","timestamp","tag","output","WebGLShaderProgram","gl","vertexShaderSource","fragmentShaderSource","program","shaders","error","shader","name","location","info","type","exhaustiveCheck","numUniforms","i","SUPPORTED_UNIFORM_TYPES","source","parameter","SUPPORTED_UNIFORM_TYPES_","pragmaInjectDefines","WebGLShaderPrograms","code","replaceSourceDefines","defines","definesSource","key","nextLineNumber","sourceToInject","lut","generateUUID","d0","d1","d2","d3","Node","EPSILON","ARRAY_TYPE","degree","toRadian","y","create","out","glMatrix.ARRAY_TYPE","fromMat4","invert","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","multiply","b0","b1","b2","b3","fromScaling","v","fromRotationTranslationScale","q","s","x","z","w","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","sx","sy","sz","perspectiveNO","fovy","aspect","near","far","f","nf","perspective","orthoNO","left","right","bottom","top","lr","bt","ortho","targetTo","eye","target","up","eyex","eyey","eyez","upx","upy","upz","z0","z1","len","x0","x1","clone","length","fromValues","copy","set","add","subtract","scale","scaleAndAdd","distance","normalize","dot","cross","ax","ay","az","bx","by","bz","bezier","c","d","t","inverseFactor","inverseFactorTimesTwo","factorTimes2","factor1","factor2","factor3","factor4","transformMat4","m","equals","a0","a1","a2","glMatrix.EPSILON","sub","vec","stride","offset","count","fn","arg","l","setAxisAngle","axis","rad","aw","bw","slerp","omega","cosom","sinom","scale0","scale1","fromMat3","fTrace","fRoot","j","k","vec4.clone","vec4.copy","vec4.normalize","tmpvec3","vec3.create","xUnitVec3","vec3.fromValues","yUnitVec3","vec3.dot","vec3.cross","vec3.len","vec3.normalize","temp1","temp2","matr","mat3.create","view","squaredLength","lerp","exactEquals","Box3","min","max","vec3.clone","p","matrix","corners","tmp","vec3.transformMat4","GeometryAttributeIndex","Geometry","vertexData","indexData","primitive","attr","acc","curr","box","point","WebGLBuffers","geometry","buffers","vao","vboType","vbo","attributes","strideBytes","idx","eboType","ebo","WebGLTextures","texture","index","textureType","textureId","id","bytes","minFilter","maxFilter","filter","dataFormat","dataType","mode","format","levels","depth","width","height","total","Box2","vec2.clone","vec2.fromValues","vec2.exactEquals","WebGLState","cap","src","dst","enabled","flag","clampedBox","axisDirection","mat4.fromScaling","mat4.create","WebGLRenderer","viewport","viewportBox","rendererBox","opaque","transparent","frustum","renderContext","layer","camera","object","objectIndex","wireframeProgram","modelView","mat4.multiply","projection","resolution","objectUniforms","uniformName","newViewport","MAX_CONCURRENT","ChunkQueue","maxConcurrent","chunk","running","priorityA","priorityB","item","controller","promise","err","chunkDataTypes","isChunkData","ChunkData","supportedDataTypeNames","dtype","coordToIndex","lod","coord","almostEqual","epsilon","ChunkStore","loader","chunksT","chunksC","chunksAtT","xLod","yLod","zLod","chunkWidth","chunkHeight","chunkDepth","chunksX","chunksY","chunksZ","xOffset","yOffset","zOffset","timeIndex","sliceCoords","signal","xDim","yDim","rx","ry","tLod","prevTLod","cLod","prevCLod","clamp","INTERNAL_POLICY_KEY","ChunkStoreView","store","policy","dimensions","xLod0","yLod0","vec2.squaredLength","currentTimeIndex","currentTimeChunks","currentLODChunks","lowestResLOD","viewBounds2D","virtualWidth","canvasElement","bufferWidth","virtualUnitsPerScreenPixel","lodFactor","zBounds","visibleChunks","viewState","newPolicy","sourceAdjusted","desiredLOD","minPolicyLOD","maxPolicyLOD","viewBoundsCenter2D","vec2.create","vec2.lerp","zMin","zMax","viewBounds3D","markUnused","viewBounds2DCenter","paddedBounds","isInBounds","isChannelInSlice","isCurrentLOD","isFallbackLOD","prefetch","visible","priority","orderKey","numTimePoints","tEnd","squareDistance","normalizedDistance","isVisible","isPrefetch","bounds","chunkBounds","zDim","zShape","zScale","zTran","zPoint","zChunk","newBounds","vec2.equals","padX","padY","padZ","center","chunkCenter","dx","dy","state","ChunkManager","views","affectedChunks","existingOrPending","pending","_","updatedChunks","_viewState","anyVisible","anyPrefetch","minPriority","orderKeyForMinPriority","Stats","container","event","showPanel","addPanel","panel","beginTime","prevTime","frames","fpsPanel","msPanel","memPanel","time","memory","fg","bg","round","PR","WIDTH","HEIGHT","TEXT_X","TEXT_Y","GRAPH_X","GRAPH_Y","GRAPH_WIDTH","GRAPH_HEIGHT","context","maxValue","createStats","stats","LayerManager","callback","eventTypes","isEventType","EventContext","EventDispatcher","element","listener","e","Viewport","props","clientX","clientY","client","viewportRect","canvasRect","devicePixelRatio","canvasX","canvasY","canvasHeight","relativeX","relativeY","position","rect","clipPos","aspectRatio","validateViewportProps","viewportProps","elementToViewportId","seenViewportIds","existingViewportId","elementDescription","parseViewportConfigs","viewportConfigs","config","PixelSizeObserver","elements","wasChanged","Idetik","sizeDependents","overlay","WireframeGeometry","edgeSet","wireframeIndices","addEdge","i0","i1","i2","WORLD_UP","TrsTransform","quat.create","quat.multiply","quat.copy","quat.clone","vec3.add","vec3.copy","vec3.multiply","vec3.equals","mat4.targetTo","rotation","mat3.fromMat4","quat.fromMat3","quat.normalize","mat4.invert","mat4.fromRotationTranslationScale","RenderableObject","oldTexture","stale","programName","Plane","normal","vec3.length","inv","vec3.scale","Frustum","n","vec3.set","plane","Camera","vec4.fromValues","projectionInverse","viewPos","vec4.transformMat4","vec4.create","vec4.scale","worldPos","DEFAULT_ASPECT_RATIO","DEFAULT_WIDTH","DEFAULT_HEIGHT","OrthographicCamera","centerX","centerY","factor","topLeft","bottomRight","viewProjection","frameAspectRatio","viewportHalfWidth","viewportHalfHeight","mat4.ortho","DEFAULT_FOV","MIN_FOV","MAX_FOV","PerspectiveCamera","options","fov","mat4.perspective","glMatrix.toRadian","LEFT_MOUSE_BUTTON","PanZoomControls","posBeforeZoom","zoomFactor","posAfterZoom","delta","vec3.sub","Layer","opacity","blendMode","_context","newState","prevState","ProjectedLineGeometry","path","vertices","path_proportion","total_distance","vec3.distance","direction","current","previous","next","indices","ProjectedLine","taperOffset","taperPower","AxesLayer","makeAxis","end","ProjectedLineLayer","lines","line","getPathBoundingBox","getAxisBounds","values","xMin","xMax","yMin","yMax","TracksLayer","tracks","track","interpolatedPath","cubicBezierInterpolation","paths","pointsPerSegment","tangentFactor","tangents","pathTangents","vec3.scaleAndAdd","o","vec3.bezier","m0","m1","PlaneGeometry","widthSegments","heightSegments","vertex","gridX","gridY","gridX1","gridY1","segmentW","segmentH","iy","ix","u","normals","uvs","isTextureUnpackRowAlignment","bufferToDataType","buffer","textureDefaultValueRange","Texture","MAX_CHANNELS","validateChannel","contrastLimits","validateContrastLimits","validateChannels","channelProps","ImageRenderable","channels","textureToShader","channelIndex","property","newChannel","valueOffset","valueScale","channel","dataTypeToScalarImageShader","dataTypeToArrayImageShader","Texture2DArray","data","handlePointPickingEvent","pointerDownPos","getValueAtWorld","onPickValue","dragThreshold","pointerUpPos","vec2.distance","world","RenderablePool","bin","disposer","ChunkedImageLayer","layerOptions","orderedByLOD","nonVisibleChunks","image","zPointWorld","zValue","zLocal","zIdx","zClamped","sliceSize","existing","pooled","poolKeyForImageRenderable","currentLOD","localPos","pixelIndex","debug","chunks","Texture3D","BoxGeometry","depthSegments","wSeg","hSeg","dSeg","axisU","axisV","axisW","udir","vdir","faceWidth","faceHeight","faceDepth","wdir","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","vertexPosition","vy","vx","VolumeRenderable","dataTypeToVolumeShader","VolumeLayer","renderable","ImageLayer","region","Texture2D","defaultColorCycle","validateLookupTable","lookupTable","validateCycle","cycle","LabelColorMap","supportedDataTypes","validateImageData","imageData","LabelImageRenderable","colorCycleTexture","colorLookupTableTexture","colorMap","keys","numColors","LabelImageLayer","outlineSelected","AbortError","PromiseScheduler","task","resolve","reject","ImageSeriesLoader","seriesDimensionalIndex","seriesAttributes","token","newToken","allDimensions","seriesDimension","availableDims","seriesDimScale","seriesMax","indexIsFull","seriesStart","seriesStop","seriesLength","pointRegion","dimIndex","loadPromises","results","ImageSeriesLayer","seriesDimensionName","NodeNotFoundError","KeyError","BitroundCodec","configuration","_meta","meta","_arr","arr","BoolArray","#bytes","byteOffset","ByteStringArray","#encoder","chars","encoded","UnicodeStringArray","#data","str","json_decode_object","byteswap_inplace","bytes_per_element","numFlips","endByteIndex","CONSTRUCTORS","V2_STRING_REGEX","get_ctr","data_type","match","kind","ctr","get_strides","shape","order","row_major_stride","col_major_stride","ndim","step","create_chunk_key_encoder","separator","chunk_coords","get_array_order","codecs","endian_regex","coerce_dtype","endian","rest","v2_to_v3_array_metadata","v2_to_v3_group_metadata","is_dtype","query","is_boolean","is_string","is_bigint","is_object","is_sharding_codec","codec","ensure_correct_scalar","metadata","LITTLE_ENDIAN_OS","system_is_little_endian","TypedArray","BytesCodec","#strides","#TypedArray","#BYTES_PER_ELEMENT","#shape","#endian","sample","Crc32cCodec","throw_on_nan_replacer","_key","sort_keys_replacer","sorted","JsonCodec","#encoder_config","#decoder_config","encoding","skipkeys","ensure_ascii","check_circular","allow_nan","sort_keys","indent","strict","separators","buf","replacer_functions","items","replacer","new_value","sub_replacer","json_str","chr","full_str","proxy","prop","empty_like","convert_array_order","n_dims","size","src_data","out_data","src_idx","out_idx","dim","get_order","row_major_strides","TransposeCodec","VLenUTF8","_chunk","decoder","pos","item_length","create_default_registry","registry","create_codec_pipeline","chunk_metadata","load_codecs","chunk_meta","promises","Codec","array_to_array","array_to_bytes","bytes_to_bytes","is_typed_array_like_meta","MAX_BIG_UINT","create_sharded_chunk_getter","shard_shape","encode_shard_key","sharding_config","get_range","index_shape","index_codec","cache","chunk_coord","shard_coord","shard_path","checksum_size","index_size","linear_offset","sel","Location","root","Group","#metadata","CONTEXT_MARKER","get_context","obj","create_context","shared_context","native_order","chunk_key","chunk_path","maybe_bytes","VERSION_COUNTER","create_version_counter","version_counts","get_counts","counts","version","load_attrs","meta_bytes","open_v2","loc","attrs","open_array_v2","open_group_v2","Array","_open_v3","meta_doc","open_v3","node","open","version_max","open_primary","open_secondary","fetch_range","url","opts","merge_init","storeOverrides","requestOverrides","base","resolved","handle_response","response","fetch_suffix","suffix_length","init","use_suffix_request","content_length","FetchStore","#overrides","#use_suffix_request","#merge_init","overrides","href","range","start","stop","product","iterables","iterators","it","slice_indices","step_is_negative","lower","upper","slice","create_queue","IndexError","msg","err_too_many_indices","selection","err_boundscheck","dim_len","err_negative_step","check_selection_length","normalize_integer_selection","dim_sel","IntDimIndexer","dim_chunk_len","dim_chunk_ix","dim_offset","dim_chunk_sel","SliceDimIndexer","dim_chunk_ix_from","dim_chunk_ix_to","dim_limit","dim_out_offset","dim_chunk_sel_start","remainder","dim_chunk_sel_stop","dim_chunk_nitems","dim_out_sel","normalize_selection","normalized","BasicIndexer","chunk_shape","ixr","sixr","dim_projections","mapping","unwrap","get","setter","_internal_get_array_context","indexer","queue","object_array_view","from","to","compat_chunk","get_typed_array_constructor","compat_scalar","dest","set_scalar_binary","projections","set_from_chunk_binary","get_with_setter","indices_len","out_selection","slices","curr_stride","proj","projs","dstride","dstrides","sstride","sstrides","sfrom","sstep","resolveFileHandleForPath","dirs","fname","dir","WebFileSystemStore","#root","fh","openGroup","zarr.open","openArray","openArrayFromParams","rootLocation","arrayLocation","createZarrArrayParams","arrayPath","zarrVersion","DEFAULT_WORKER_COUNT","workerPool","messageId","workerId","pendingMessages","canceledMessages","getWorkerInstance","worker","instance","handleWorkerMessage","success","workerInstance","handleWorkerError","workerIndex","failedWorkerId","replacementWorker","createWorker","WorkerKernel","getLeastBusyWorker","getChunkInWorker","zarrParams","chunkIndex","abortListener","ensureWorkerPool","terminateWorkerPool","getChunk","array","arrayParams","chunkCoords","PromiseQueue","scheduler","OmeZarrImageLoader","inferSourceDimensionMap","receivedChunk","validateTightlyPackedChunk","receivedShape","rowAlignment","receivedChunkData","receivedChunkStride","compactSize","compactData","zStride","yStride","zStart","srcStart","srcEnd","subarray","zarr.get","calculateOffset","xIndex","yIndex","compareDimensions","dLod","regionIndex","zarr.slice","arrays","dimensionNames","numAxes","findDimensionIndex","makeSourceDimension","lods","dataset","translation","dims","zIndex","findDimensionIndexSafe","cIndex","tIndex","util","val","assertIs","_arg","assertNever","_x","validKeys","filtered","checker","joinValues","objectUtil","first","second","ZodParsedType","getParsedType","ZodIssueCode","quotelessJson","ZodError","issues","subs","actualProto","_mapper","mapper","issue","fieldErrors","processError","el","formErrors","errorMap","_ctx","overrideErrorMap","setErrorMap","map","getErrorMap","makeIssue","errorMaps","issueData","fullPath","fullIssue","errorMessage","maps","EMPTY_PATH","addIssueToContext","ctx","overrideMap","ParseStatus","status","arrayValue","INVALID","pairs","syncPairs","pair","finalObject","DIRTY","OK","isAborted","isDirty","isValid","isAsync","__classPrivateFieldGet","receiver","__classPrivateFieldSet","errorUtil","_ZodEnum_cache","_ZodNativeEnum_cache","ParseInputLazyPath","parent","handleResult","processCreateParams","invalid_type_error","required_error","description","iss","_a","_b","ZodType","input","maybeAsyncResult","check","getIssueProperties","setError","refinementData","refinement","ZodEffects","ZodFirstPartyTypeKind","def","ZodOptional","ZodNullable","ZodArray","ZodPromise","option","ZodUnion","incoming","ZodIntersection","transform","defaultValueFunc","ZodDefault","ZodBranded","catchValueFunc","ZodCatch","This","ZodPipeline","ZodReadonly","cuidRegex","cuid2Regex","ulidRegex","uuidRegex","nanoidRegex","jwtRegex","durationRegex","emailRegex","_emojiRegex","emojiRegex","ipv4Regex","ipv4CidrRegex","ipv6Regex","ipv6CidrRegex","base64Regex","base64urlRegex","dateRegexSource","dateRegex","timeRegexSource","regex","timeRegex","datetimeRegex","isValidIP","ip","isValidJWT","jwt","alg","header","base64","decoded","isValidCidr","ZodString","tooBig","tooSmall","validation","minLength","maxLength","ch","floatSafeRemainder","valDecCount","stepDecCount","decCount","valInt","stepInt","ZodNumber","inclusive","ZodBigInt","ZodBoolean","ZodDate","minDate","maxDate","ZodSymbol","ZodUndefined","ZodNull","ZodAny","ZodUnknown","ZodNever","ZodVoid","schema","deepPartialify","ZodObject","newShape","fieldSchema","ZodTuple","shapeKeys","extraKeys","keyValidator","unknownKeys","catchall","_c","_d","defaultError","augmentation","merging","mask","newField","createZodEnum","handleResults","unionErrors","childCtx","dirty","types","getDiscriminator","ZodLazy","ZodLiteral","ZodEnum","ZodNativeEnum","ZodDiscriminatedUnion","discriminator","discriminatorValue","optionsMap","discriminatorValues","mergeValues","aType","bType","bKeys","sharedKeys","newObj","sharedValue","newArray","itemA","itemB","handleParsed","parsedLeft","parsedRight","merged","itemIndex","schemas","ZodRecord","keyType","valueType","third","ZodMap","finalMap","ZodSet","finalizeSet","parsedSet","minSize","maxSize","ZodFunction","makeArgsIssue","makeReturnsIssue","returns","me","parsedArgs","parsedReturns","returnType","func","getter","expectedValues","enumValues","newDef","opt","nativeEnumValues","promisified","effect","checkCtx","processed","executeRefinement","inner","preprocess","newCtx","ZodNaN","BRAND","inResult","freeze","cleanParams","custom","_params","fatal","_fatal","late","instanceOfType","cls","stringType","numberType","nanType","bigIntType","booleanType","dateType","symbolType","undefinedType","nullType","anyType","unknownType","neverType","voidType","arrayType","objectType","strictObjectType","unionType","discriminatedUnionType","intersectionType","tupleType","recordType","mapType","setType","functionType","lazyType","literalType","enumType","nativeEnumType","promiseType","effectsType","optionalType","nullableType","preprocessType","pipelineType","ostring","onumber","oboolean","coerce","NEVER","Image","errors","Plate","Well","versions","versionsSet","maybeGetVersion","ome","getVersion","omeZarrToZarrVersion","omeVersion","removeProperty","objCopy","loadOmeZarrPlate","zarr.Location","zarr.FetchStore","group","parsePlate","adaptPlateV04ToV05","PlateV04","platev04","adaptWellV04ToV05","wellv04","parseWell","WellV04","loadOmeZarrWell","loadOmeroChannels","parseOmeZarrImage","loadOmeroDefaults","adaptImageV04ToV05","imagev04","parseImage","ImageV04","OmeZarrImageSource","adaptedOmeImage","images","axes","ALL_CATEGORIES","createImageSourcePolicy","validatePolicyConfig","priorityMap","cat","createExplorationPolicy","mergeConfig","createPlaybackPolicy","createNoPrefetchPolicy","Spherical","radius","phi","theta","Points","points","markerAtlas","marker"],"mappings":"AAIO,MAAMA,EAAM;AAAA,EACjB,OAAuB,MAAa,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC3D,OAAuB,QAAe,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC7D,OAAuB,OAAc,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC5D,OAAuB,SAAgB,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC9D,OAAuB,UAAiB,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC/D,OAAuB,OAAc,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC5D,OAAuB,QAAe,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC7D,OAAuB,QAAe,IAAIA,EAAM,GAAK,GAAK,CAAG;AAAA,EAC7D,OAAuB,cAAqB,IAAIA,EAAM,GAAK,GAAK,GAAK,CAAG;AAAA;AAAA,EAGvD;AAAA,EAEjB,YAAYC,GAAWC,GAAWC,GAAWC,GAAY;AACnD,QAAAH,IAAI,KAAKA,IAAI,KAAKC,IAAI,KAAKA,IAAI,KAAKC,IAAI,KAAKA,IAAI;AAC7C,YAAA,IAAI,MAAM,wCAAwC;AAE1D,QAAIC,MAAM,WAAcA,IAAI,KAAKA,IAAI;AAC7B,YAAA,IAAI,MAAM,yCAAyC;AAE3D,SAAK,QAAQ,CAACH,GAAGC,GAAGC,GAAGC,KAAK,CAAG;AAAA,EAAA;AAAA,EAGjC,IAAW,MAAgC;AACzC,WAAO,CAAC,KAAK,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EAAA;AAAA,EAGrD,IAAW,OAAkD;AAC3D,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAW,IAAY;AACd,WAAA,KAAK,MAAM,CAAC;AAAA,EAAA;AAAA,EAGrB,IAAW,IAAY;AACd,WAAA,KAAK,MAAM,CAAC;AAAA,EAAA;AAAA,EAGrB,IAAW,IAAY;AACd,WAAA,KAAK,MAAM,CAAC;AAAA,EAAA;AAAA,EAGrB,IAAW,IAAY;AACd,WAAA,KAAK,MAAM,CAAC;AAAA,EAAA;AAAA,EAGrB,IAAW,SAAiB;AAC1B,WAAO,IAAI,KAAK,eAAe,KAAK,CAAC,CAAC,GAAG,KAAK,eAAe,KAAK,CAAC,CAAC,GAAG,KAAK,eAAe,KAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAGpG,IAAW,SAAiB;AAEvB,WAAA,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,KAC5B,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,KAC5B,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAC7B,KAAK,MAAM,KAAK,IAAI,GAAG;AAAA,EAAA;AAAA,EAI3B,OAAc,KAAKC,GAA6B;AAC9C,QAAIA,aAAqBL;AAChB,aAAAK;AAGL,QAAA,MAAM,QAAQA,CAAS;AACzB,aAAO,IAAIL,EAAMK,EAAU,CAAC,GAAGA,EAAU,CAAC,GAAGA,EAAU,CAAC,GAAGA,EAAU,CAAC,CAAC;AAGnE,UAAA,IAAI,MAAM,0BAA0B;AAAA,EAAA;AAAA,EAG5C,OAAc,WAAWC,GAAoB;AACrC,UAAAC,IAAS,4CAA4C,KAAKD,CAAG;AACnE,QAAI,CAACC;AACG,YAAA,IAAI,MAAM,qCAAqC;AAEvD,WAAO,IAAIP;AAAA,MACT,SAASO,EAAO,CAAC,GAAG,EAAE,IAAI;AAAA,MAC1B,SAASA,EAAO,CAAC,GAAG,EAAE,IAAI;AAAA,MAC1B,SAASA,EAAO,CAAC,GAAG,EAAE,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EAAA;AAAA,EAGM,eAAeC,GAAuB;AACtC,UAAAF,IAAM,KAAK,MAAME,IAAQ,GAAG,EAC/B,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,WAAOF,EAAI,WAAW,IAAI,MAAMA,IAAMA;AAAA,EAAA;AAE1C;AC3FO,MAAeG,GAAS;AAAA,EACZ;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,mBAA0B,IAAIT,EAAM,GAAG,GAAG,GAAG,CAAC;AAAA,EAE5C,mBAAmB;AAAA,EAS7B,YAAYU,GAA2B;AACrC,SAAK,UAAUA,GACf,KAAK,mBAAmB;AAAA,EAAA;AAAA,EAKnB,aAAmB;AACxB,SAAK,mBAAmB,GACxB,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,EAAA;AAAA,EAG/B,qBAAqB;AAC3B,SAAK,SAAS,KAAK,OAAO,cAAc,OAAO,kBAC/C,KAAK,UAAU,KAAK,OAAO,eAAe,OAAO,kBAE7C,KAAK,OAAO,UAAU,KAAK,WAAa,KAAA,OAAO,QAAQ,KAAK,SAC5D,KAAK,OAAO,WAAW,KAAK,YAAc,KAAA,OAAO,SAAS,KAAK;AAAA,EAAA;AAAA,EAGrE,IAAc,SAAS;AACrB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAW,QAAQ;AACjB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAW,SAAS;AAClB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAW,kBAAyB;AAClC,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAW,kBAAkB;AAC3B,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAW,gBAAgBC,GAAkB;AACtC,SAAA,mBAAmBX,EAAM,KAAKW,CAAK;AAAA,EAAA;AAE5C;AC/DA,IAAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACmCO,MAAMC,KAAyC;AAAA,EACpD,eAAe;AAAA,IACb,QAAQC;AAAAA,IACR,UAAUC;AAAAA,EACZ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQC;AAAAA,IACR,UAAUC;AAAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,QAAQC;AAAAA,IACR,UAAUC;AAAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IAChB,QAAQC;AAAAA,IACR,UAAUC;AAAAA,EACZ;AAAA,EACA,uBAAuB;AAAA,IACrB,QAAQD;AAAAA,IACR,UAAUE;AAAAA,EACZ;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQF;AAAAA,IACR,UAAUC;AAAAA,IACV,qCAAqB,IAAI,CAAC,CAAC,yBAAyB,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,qBAAqB;AAAA,IACnB,QAAQD;AAAAA,IACR,UAAUE;AAAAA,IACV,qCAAqB,IAAI,CAAC,CAAC,yBAAyB,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,iBAAiB;AAAA,IACf,QAAQF;AAAAA,IACR,UAAUC;AAAAA,IACV,qCAAqB,IAAI,CAAC,CAAC,0BAA0B,GAAG,CAAC,CAAC;AAAA,EAC5D;AAAA,EACA,sBAAsB;AAAA,IACpB,QAAQD;AAAAA,IACR,UAAUE;AAAAA,IACV,qCAAqB,IAAI,CAAC,CAAC,0BAA0B,GAAG,CAAC,CAAC;AAAA,EAC5D;AAAA,EACA,YAAY;AAAA,IACV,QAAQF;AAAAA,IACR,UAAUG;AAAAA,EACZ;AAAA,EACA,aAAa;AAAA,IACX,QAAQC;AAAAA,IACR,UAAUC;AAAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,QAAQD;AAAAA,IACR,UAAUC;AAAAA,IACV,qCAAqB,IAAI,CAAC,CAAC,yBAAyB,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,YAAY;AAAA,IACV,QAAQD;AAAAA,IACR,UAAUC;AAAAA,IACV,qCAAqB,IAAI,CAAC,CAAC,0BAA0B,GAAG,CAAC,CAAC;AAAA,EAAA;AAE9D,GC5FMC,KAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT,GAEMC,KAAS;AAAA,EACb,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AACT;AA4BO,SAASC,KAAiD;AACzD,QAAAC,IACJ,OAAO,UAAY,OAAe,OAAO,QAAQ,KAAK,YAAa,WAC/D,QAAQ,IAAI,WACZ;AAEN,MACEA,MAAY,gBACZA,MAAY,iBACZA,MAAY;AAEL,WAAAA;AAGL,MAAA,OAAO,SAAW,KAAa;AAC3B,UAAA,EAAE,UAAAC,MAAa;AAErB,QACEA,MAAa,gBACbA,MAAa,iBACbA,MAAa;AAEN,aAAAA;AAAA,EACT;AAGK,SAAA;AACT;AACO,MAAMC,EAAO;AAAA,EAClB,OAAe,YACbH,GAAQ,MAAM,eAAe,SAAS;AAAA,EAExC,OAAc,YAAYI,GAAiB;AACzC,IAAAD,EAAO,YAAYC;AAAA,EAAA;AAAA,EAGrB,OAAc,MACZC,GACAC,MACGC,GACH;AACA,IAAAJ,EAAO,IAAI,SAASE,GAAYC,GAAS,GAAGC,CAAM;AAAA,EAAA;AAAA,EAGpD,OAAc,KACZF,GACAC,MACGC,GACH;AACA,IAAAJ,EAAO,IAAI,QAAQE,GAAYC,GAAS,GAAGC,CAAM;AAAA,EAAA;AAAA,EAGnD,OAAc,KACZF,GACAC,MACGC,GACH;AACA,IAAAJ,EAAO,IAAI,QAAQE,GAAYC,GAAS,GAAGC,CAAM;AAAA,EAAA;AAAA,EAGnD,OAAc,MACZF,GACAC,MACGC,GACH;AACA,IAAAJ,EAAO,IAAI,SAASE,GAAYC,GAAS,GAAGC,CAAM;AAAA,EAAA;AAAA,EAGpD,OAAe,IACbH,GACAC,GACAC,MACGE,GACH;AACA,QAAIV,GAAOM,CAAK,IAAIN,GAAOK,EAAO,SAAS,EAAG;AAE9C,UAAMM,KAAY,oBAAI,KAAK,GAAE,YAAY,GACnCrC,IAAQ2B,GAAOK,CAAK,GACpBM,IAAM,IAAID,CAAS,KAAKL,EAAM,aAAa,KAAKC,CAAU,KAC1DM,IAAS,CAAC,GAAGvC,CAAK,GAAGsC,CAAG,IAAIJ,GAAS,GAAGE,CAAI;AAElD,YAAQJ,GAAO;AAAA,MACb,KAAK;AACK,gBAAA,MAAM,GAAGO,CAAM;AACvB;AAAA,MACF,KAAK;AACK,gBAAA,KAAK,GAAGA,CAAM;AACtB;AAAA,MACF,KAAK;AACK,gBAAA,KAAK,GAAGA,CAAM;AACtB;AAAA,MACF,KAAK;AACK,gBAAA,MAAM,GAAGA,CAAM;AACvB;AAAA,IAAA;AAAA,EACJ;AAEJ;ACvIO,MAAMC,GAAmB;AAAA,EACb;AAAA,EACA;AAAA,EACA,mCAGT,IAAI;AAAA,EAEZ,YACEC,GACAC,GACAC,GACA;AACA,SAAK,MAAMF;AAEL,UAAAG,IAAUH,EAAG,cAAc;AACjC,QAAI,CAACG;AACG,YAAA,IAAI,MAAM,uCAAuC;AAEzD,SAAK,WAAWA;AAEhB,UAAMC,IAAU,CAAC;AACb,QAAA;AACF,MAAAA,EAAQ,KAAK,KAAK,UAAUH,GAAoBD,EAAG,aAAa,CAAC,GACjEI,EAAQ,KAAK,KAAK,UAAUF,GAAsBF,EAAG,eAAe,CAAC,GACrE,KAAK,KAAK,GACV,KAAK,2BAA2B;AAAA,aACzBK,GAAO;AACd,YAAAL,EAAG,cAAcG,CAAO,GAClBE;AAAA,IAAA,UACN;AACA,MAAAD,EAAQ,QAAQ,CAACE,MAAW,KAAK,IAAI,aAAaA,CAAM,CAAC;AAAA,IAAA;AAAA,EAC3D;AAAA,EAGK,WAAWC,GAAcnD,GAAgB;AACxC,UAAA,CAACoD,GAAUC,CAAI,IAAI,KAAK,aAAa,IAAIF,CAAI,KAAK,CAAC;AACrD,QAAA,CAACC,KAAY,CAACC;AAChB,YAAM,IAAI,MAAM,YAAYF,CAAI,+BAA+B;AAEjE,UAAMG,IAAOD,EAAK;AAClB,YAAQC,GAAM;AAAA;AAAA;AAAA;AAAA,MAIZ,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AACR,QAAA,OAAOtD,KAAU,WACd,KAAA,IAAI,UAAUoD,GAAUpD,CAAK,IAE7B,KAAA,IAAI,WAAWoD,GAAUpD,CAAyB;AAEzD;AAAA,MACF,KAAK,KAAK,IAAI;AACP,aAAA,IAAI,WAAWoD,GAAUpD,CAAa;AAC3C;AAAA,MACF,KAAK,KAAK,IAAI;AACP,aAAA,IAAI,WAAWoD,GAAUpD,CAAa;AAC3C;AAAA,MACF,KAAK,KAAK,IAAI;AACZ,aAAK,IAAI,iBAAiBoD,GAAU,IAAOpD,CAAa;AACxD;AAAA,MACF,KAAK,KAAK,IAAI;AACP,aAAA,IAAI,UAAUoD,GAAUpD,CAAe;AAC5C;AAAA,MACF,KAAK,KAAK,IAAI;AACP,aAAA,IAAI,WAAWoD,GAAUpD,CAAe;AAC7C;AAAA;AAAA,MAEF,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AAAA,MACd,KAAK,KAAK,IAAI;AACP,aAAA,IAAI,UAAUoD,GAAUpD,CAAe;AAC5C;AAAA,MACF,SAAS;AACP,cAAMuD,IAAyBD;AAC/B,cAAM,IAAI,MAAM,2BAA2BC,CAAe,EAAE;AAAA,MAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAGM,6BAA6B;AAC7B,UAAAC,IAAc,KAAK,IAAI;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK,IAAI;AAAA,IACX;AACA,aAASC,IAAI,GAAGA,IAAID,GAAaC,KAAK;AACpC,YAAMJ,IAAO,KAAK,IAAI,iBAAiB,KAAK,UAAUI,CAAC;AACvD,UAAIJ,GAAM;AACR,YAAI,CAACK,GAAwB,IAAIL,EAAK,IAAI;AACxC,gBAAM,IAAI;AAAA,YACR,6BAA6BA,EAAK,IAAI,mDAAmDA,EAAK,IAAI;AAAA,UACpG;AAGF,cAAMD,IAAW,KAAK,IAAI,mBAAmB,KAAK,UAAUC,EAAK,IAAI;AACrE,QAAID,MACF,KAAK,aAAa,IAAIC,EAAK,MAAM,CAACD,GAAUC,CAAI,CAAC,GAC1CnB,EAAA;AAAA,UACL;AAAA,UACA;AAAA,UACAmB,EAAK;AAAA,UACLA,EAAK;AAAA,UACLA,EAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAGM,UAAUM,GAAgBL,GAAc;AAC9C,UAAMJ,IAAS,KAAK,IAAI,aAAaI,CAAI;AACzC,QAAI,CAACJ;AACH,YAAM,IAAI,MAAM,yCAAyCI,CAAI,EAAE;AAK7D,QAFC,KAAA,IAAI,aAAaJ,GAAQS,CAAM,GAC/B,KAAA,IAAI,cAAcT,CAAM,GACzB,CAAC,KAAK,IAAI,mBAAmBA,GAAQ,KAAK,IAAI,cAAc,GAAG;AACjE,YAAMb,IAAU,KAAK,IAAI,iBAAiBa,CAAM;AAC3C,iBAAA,IAAI,aAAaA,CAAM,GACtB,IAAI,MAAM,2BAA2Bb,CAAO,EAAE;AAAA,IAAA;AAGtD,gBAAK,IAAI,aAAa,KAAK,UAAUa,CAAM,GACpCA;AAAA,EAAA;AAAA,EAGD,OAAO;AAEb,QADK,KAAA,IAAI,YAAY,KAAK,QAAQ,GAC9B,CAAC,KAAK,aAAa,KAAK,IAAI,WAAW,GAAG;AAC5C,YAAMb,IAAU,KAAK,IAAI,kBAAkB,KAAK,QAAQ;AACxD,YAAM,IAAI,MAAM,0BAA0BA,CAAO,EAAE;AAAA,IAAA;AAAA,EACrD;AAAA,EAGK,MAAM;AACN,SAAA,IAAI,WAAW,KAAK,QAAQ;AAAA,EAAA;AAAA,EAG3B,aAAauB,GAAmB;AACtC,WAAO,KAAK,IAAI,oBAAoB,KAAK,UAAUA,CAAS;AAAA,EAAA;AAAA,EAG9D,IAAW,eAAyB;AAClC,WAAO,MAAM,KAAK,KAAK,aAAa,MAAM;AAAA,EAAA;AAE9C;AAGA,MAAMC,KACJ,OAAO,SAAW,MACd;AAAA,EACE,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AACzB,IACA,CAAC,GAEDH,KAA+C,IAAI;AAAA,EACvDG;AACF,GChMMC,KAAsB;AAErB,MAAMC,GAAoB;AAAA,EACvB;AAAA,EACA,gCAAiD,IAAI;AAAA,EAE7D,YAAYnB,GAA4B;AACtC,SAAK,MAAMA;AAAA,EAAA;AAAA,EAGN,IAAIM,GAAoC;AAC7C,QAAIH,IAAU,KAAK,UAAU,IAAIG,CAAM;AACvC,QAAIH,MAAY,QAAW;AACnB,YAAAiB,IAAOhD,GAAWkC,CAAM,GACxBL,IAAqBoB;AAAA,QACzBD,EAAK;AAAA,QACLA,EAAK;AAAA,MACP,GACMlB,IAAuBmB;AAAA,QAC3BD,EAAK;AAAA,QACLA,EAAK;AAAA,MACP;AACA,MAAAjB,IAAU,IAAIJ;AAAA,QACZ,KAAK;AAAA,QACLE;AAAA,QACAC;AAAA,MACF,GACAC,EAAQ,IAAI;AACN,YAAAE,IAAQ,KAAK,IAAI,SAAS;AAC5B,UAAAA,MAAU,KAAK,IAAI;AACrB,cAAM,IAAI,MAAM,8BAA8BA,CAAK,EAAE;AAElD,WAAA,UAAU,IAAIC,GAAQH,CAAO;AAAA,IAAA;AAElC,MAAAA,EAAQ,IAAI;AAEP,WAAAA;AAAA,EAAA;AAEX;AAEA,SAASkB,GACPN,GACAO,GACQ;AACR,MAAIA,MAAY,UAAaA,EAAQ,QAAQ,EAAU,QAAAP;AACvD,MAAI,CAACA,EAAO,SAASG,EAAmB;AACtC,UAAM,IAAI;AAAA,MACR,mCAAmCA,EAAmB;AAAA,IACxD;AAEF,QAAMK,IAAgB,MAAMD,EAAQ,SAAS,EAC1C,IAAI,CAAC,CAACE,GAAKpE,CAAK,MAAM,WAAWoE,CAAG,IAAIpE,CAAK,EAAE,EAC/C,KAAK;AAAA,CAAI,GAKNqE,IAAiB,oBADE,IAAIH,EAAQ,IACsB,IACrDI,IAAiB,GAAGH,CAAa;AAAA,EAAKE,CAAc;AACnD,SAAAV,EAAO,QAAQG,IAAqBQ,CAAc;AAC3D;AC9DA,MAAMC,IAAM;AAAA,EACR;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AA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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[20,21,22,23,24,25,26,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,107]}