From 75da5ba04b3a659b3837533ef41da849cbc0fa2f Mon Sep 17 00:00:00 2001 From: Kris Nye Date: Sat, 13 Jun 2026 20:20:23 -0700 Subject: [PATCH 1/2] feat(data-gpu): voxel shapes, boolean DenseVolume, and factor-based PBR Add u32 bit-packed boolean TypedBuffer and DenseVolume for compact occupancy grids. Introduce voxelShape plugin with mesh baking, dedup, and visual bridge over physics colliders. Refactor rendering to material-palette factor PBR and update gpu samples accordingly. Co-authored-by: Cursor --- packages/data-gpu-samples/package.json | 3 +- .../pbr-ibl-instanced-service.ts | 12 +- .../pbr-model-ibl/pbr-model-ibl-service.ts | 15 +- .../src/samples/ragdoll/ragdoll-service.ts | 33 +- .../rigid-stack/rigid-stack-debug-render.ts | 4 +- .../rigid-stack/rigid-stack-service.ts | 22 +- .../skinned-fox/skinned-fox-service.ts | 12 +- .../solar-system/solar-system-service.ts | 10 +- .../src/samples/solar-system/sphere-plugin.ts | 28 +- .../scripts/flatten-mechs-definitions.mjs | 69 + .../camera/orbit/orbit-data-plugin.ts | 2 +- .../camera/orbit/orbit-system-plugin.ts | 15 +- .../src/graphics/camera/orbit/orbit.ts | 10 +- .../src/graphics/picking/picking-plugin.ts | 8 +- .../rendering/bone-collider-plugin.ts | 20 +- .../rendering/ibl-render/ibl-render-plugin.ts | 18 +- .../graphics/rendering/jolt-ragdoll-plugin.ts | 18 +- .../rendering/material-gpu/material-arrays.ts | 113 - .../material-gpu/material-bind-group.ts | 61 - .../material-gpu/material-gpu-plugin.ts | 95 - .../material-palette-gpu-plugin.ts | 86 + .../material-palette-gpu.test.ts | 20 + .../material-palette-gpu/material-palette.ts | 41 + .../palette-bind-group.ts | 24 + .../rendering/model-collider-plugin.ts | 54 +- .../src/graphics/rendering/pbr-core-plugin.ts | 15 +- ...-plugin.ts => pbr-factor-render-plugin.ts} | 171 +- ...ader.wgsl.ts => pbr-factor-shader.wgsl.ts} | 59 +- .../pbr-render/physics-bridge-plugin.ts | 110 +- .../pbr-render/primitive-render-shared.ts | 76 + .../rendering/skinning/skinning-plugin.ts | 58 +- .../graphics/scene/model/geometry/geometry.ts | 12 - .../graphics/scene/model/geometry/public.ts | 2 +- .../src/graphics/scene/model/mesh-plugin.ts | 102 + .../src/graphics/scene/model/mesh/mesh.ts | 18 + .../src/graphics/scene/model/mesh/public.ts | 3 + .../scene/model/model-loader-plugin.ts | 64 +- .../src/graphics/scene/model/model-plugin.ts | 45 +- .../src/graphics/scene/model/model.ts | 8 +- .../src/graphics/scene/model/public.ts | 4 +- .../model/shape/boolean-volume-mesh.test.ts | 42 + .../scene/model/shape/boolean-volume-mesh.ts | 150 + .../model/shape/bounds-from-shape-mesh.ts | 20 + .../model/shape/shape-geometry-plugin.ts | 127 +- .../graphics/scene/model/shape/shape-spec.ts | 10 + .../scene/model/world-bounds-plugin.ts | 31 +- .../src/graphics/scene/scene-plugin.ts | 6 +- packages/data-gpu/src/index.ts | 16 +- .../src/material/assemble-material-row.ts | 26 + packages/data-gpu/src/material/definitions.ts | 427 + .../data-gpu/src/material/emission-mode.ts | 11 + .../src/material/json/from-json-string.ts | 11 + .../src/material/json/from-json.test.ts | 50 + .../data-gpu/src/material/json/from-json.ts | 23 + .../src/material/json/is-properties-json.ts | 77 + .../src/material/json/library-json.ts | 4 + .../data-gpu/src/material/json/load-json.ts | 15 + .../src/material/json/properties-json.ts | 25 + packages/data-gpu/src/material/json/public.ts | 9 + .../src/material/json/to-definition.ts | 70 + .../src/material/material-defaults.ts | 26 + .../src/material/material-definition.ts | 4 + .../data-gpu/src/material/material-name.ts | 3 + .../src/material/material-plugin.test.ts | 97 + .../data-gpu/src/material/material-plugin.ts | 106 +- packages/data-gpu/src/material/material.ts | 69 +- packages/data-gpu/src/material/public.ts | 8 + .../data-gpu/src/material/require-material.ts | 21 + .../src/material/standard-materials.ts | 50 +- .../material/stress-strain-curve/create.ts | 9 + .../material/stress-strain-curve/public.ts | 2 + .../stress-strain-curve/schema.test.ts | 20 + .../material/stress-strain-curve/schema.ts | 20 + .../stress-strain-curve.ts | 11 + .../collider-shape/mass-from-volume.test.ts | 8 + .../body/collider-shape/mass-from-volume.ts | 4 + .../src/physics/solvers/jolt-solver-plugin.ts | 17 +- .../src/voxel-shape/require-voxel-shape.ts | 21 + .../src/voxel-shape/volume-content-key.ts | 18 + .../voxel-shape/voxel-shape-definitions.ts | 61 + .../src/voxel-shape/voxel-shape-plugin.ts | 124 + .../data-gpu/src/voxel-shape/voxel-shape.ts | 6 + packages/data/package.json | 7 + .../serialization/serialization.test.ts | 13 + .../src/table/copy-column-to-gpu-buffer.ts | 13 +- .../create-boolean-buffer.test.ts | 184 + .../src/typed-buffer/create-boolean-buffer.ts | 109 + .../src/typed-buffer/create-typed-buffer.ts | 5 + packages/data/src/typed-buffer/index.ts | 1 + .../register-typed-buffer-codecs.ts | 21 +- .../data/src/typed-buffer/typed-buffer.ts | 2 +- .../data/src/volume/dense-volume/create.ts | 9 + .../src/volume/dense-volume/dense-volume.ts | 10 + .../src/volume/dense-volume/equals.test.ts | 138 + .../data/src/volume/dense-volume/equals.ts | 15 + .../volume/dense-volume/get-coordinates.ts | 12 + .../data/src/volume/dense-volume/get-index.ts | 11 + packages/data/src/volume/dense-volume/get.ts | 17 + .../src/volume/dense-volume/index-type.ts | 2 + packages/data/src/volume/dense-volume/is.ts | 9 + .../data/src/volume/dense-volume/public.ts | 7 + packages/data/src/volume/index.ts | 3 + pnpm-lock.yaml | 9090 +++++++++-------- 103 files changed, 8028 insertions(+), 5045 deletions(-) create mode 100644 packages/data-gpu/scripts/flatten-mechs-definitions.mjs delete mode 100644 packages/data-gpu/src/graphics/rendering/material-gpu/material-arrays.ts delete mode 100644 packages/data-gpu/src/graphics/rendering/material-gpu/material-bind-group.ts delete mode 100644 packages/data-gpu/src/graphics/rendering/material-gpu/material-gpu-plugin.ts create mode 100644 packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu-plugin.ts create mode 100644 packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu.test.ts create mode 100644 packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette.ts create mode 100644 packages/data-gpu/src/graphics/rendering/material-palette-gpu/palette-bind-group.ts rename packages/data-gpu/src/graphics/rendering/pbr-render/{pbr-render-plugin.ts => pbr-factor-render-plugin.ts} (53%) rename packages/data-gpu/src/graphics/rendering/pbr-render/{pbr-array-shader.wgsl.ts => pbr-factor-shader.wgsl.ts} (59%) create mode 100644 packages/data-gpu/src/graphics/rendering/pbr-render/primitive-render-shared.ts delete mode 100644 packages/data-gpu/src/graphics/scene/model/geometry/geometry.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/mesh-plugin.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/mesh/mesh.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/mesh/public.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/shape/bounds-from-shape-mesh.ts create mode 100644 packages/data-gpu/src/graphics/scene/model/shape/shape-spec.ts create mode 100644 packages/data-gpu/src/material/assemble-material-row.ts create mode 100644 packages/data-gpu/src/material/definitions.ts create mode 100644 packages/data-gpu/src/material/emission-mode.ts create mode 100644 packages/data-gpu/src/material/json/from-json-string.ts create mode 100644 packages/data-gpu/src/material/json/from-json.test.ts create mode 100644 packages/data-gpu/src/material/json/from-json.ts create mode 100644 packages/data-gpu/src/material/json/is-properties-json.ts create mode 100644 packages/data-gpu/src/material/json/library-json.ts create mode 100644 packages/data-gpu/src/material/json/load-json.ts create mode 100644 packages/data-gpu/src/material/json/properties-json.ts create mode 100644 packages/data-gpu/src/material/json/public.ts create mode 100644 packages/data-gpu/src/material/json/to-definition.ts create mode 100644 packages/data-gpu/src/material/material-defaults.ts create mode 100644 packages/data-gpu/src/material/material-definition.ts create mode 100644 packages/data-gpu/src/material/material-name.ts create mode 100644 packages/data-gpu/src/material/material-plugin.test.ts create mode 100644 packages/data-gpu/src/material/require-material.ts create mode 100644 packages/data-gpu/src/material/stress-strain-curve/create.ts create mode 100644 packages/data-gpu/src/material/stress-strain-curve/public.ts create mode 100644 packages/data-gpu/src/material/stress-strain-curve/schema.test.ts create mode 100644 packages/data-gpu/src/material/stress-strain-curve/schema.ts create mode 100644 packages/data-gpu/src/material/stress-strain-curve/stress-strain-curve.ts create mode 100644 packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.test.ts create mode 100644 packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.ts create mode 100644 packages/data-gpu/src/voxel-shape/require-voxel-shape.ts create mode 100644 packages/data-gpu/src/voxel-shape/volume-content-key.ts create mode 100644 packages/data-gpu/src/voxel-shape/voxel-shape-definitions.ts create mode 100644 packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts create mode 100644 packages/data-gpu/src/voxel-shape/voxel-shape.ts create mode 100644 packages/data/src/typed-buffer/create-boolean-buffer.test.ts create mode 100644 packages/data/src/typed-buffer/create-boolean-buffer.ts create mode 100644 packages/data/src/volume/dense-volume/create.ts create mode 100644 packages/data/src/volume/dense-volume/dense-volume.ts create mode 100644 packages/data/src/volume/dense-volume/equals.test.ts create mode 100644 packages/data/src/volume/dense-volume/equals.ts create mode 100644 packages/data/src/volume/dense-volume/get-coordinates.ts create mode 100644 packages/data/src/volume/dense-volume/get-index.ts create mode 100644 packages/data/src/volume/dense-volume/get.ts create mode 100644 packages/data/src/volume/dense-volume/index-type.ts create mode 100644 packages/data/src/volume/dense-volume/is.ts create mode 100644 packages/data/src/volume/dense-volume/public.ts create mode 100644 packages/data/src/volume/index.ts diff --git a/packages/data-gpu-samples/package.json b/packages/data-gpu-samples/package.json index 05a1019e..e13e4ff7 100644 --- a/packages/data-gpu-samples/package.json +++ b/packages/data-gpu-samples/package.json @@ -5,8 +5,9 @@ "type": "module", "private": true, "scripts": { + "predev": "pnpm --filter @adobe/data-gpu build", "dev": "vite", - "dev:all": "pnpm --parallel --filter @adobe/data --filter @adobe/data-gpu --filter data-gpu-samples run dev", + "dev:all": "pnpm --filter @adobe/data-gpu build && pnpm --parallel --filter @adobe/data --filter @adobe/data-gpu --filter data-gpu-samples run dev", "build": "vite build" }, "dependencies": { diff --git a/packages/data-gpu-samples/src/samples/pbr-ibl-instanced/pbr-ibl-instanced-service.ts b/packages/data-gpu-samples/src/samples/pbr-ibl-instanced/pbr-ibl-instanced-service.ts index efae7d14..f9869b63 100644 --- a/packages/data-gpu-samples/src/samples/pbr-ibl-instanced/pbr-ibl-instanced-service.ts +++ b/packages/data-gpu-samples/src/samples/pbr-ibl-instanced/pbr-ibl-instanced-service.ts @@ -2,10 +2,10 @@ import { Database } from "@adobe/data/ecs"; import { Vec3 } from "@adobe/data/math"; -import { pbrRender, Model, Orbit } from "@adobe/data-gpu"; +import { pbrIblRender, Model, Orbit } from "@adobe/data-gpu"; export const pbrIblInstancedPlugin = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrRender, Orbit.plugin), + extends: Database.Plugin.combine(pbrIblRender, Orbit.plugin), transactions: { initializeScene(t, args: { modelUrl: string; @@ -19,25 +19,25 @@ export const pbrIblInstancedPlugin = Database.Plugin.create({ environmentUrl: args.envUrl ?? t.resources.light.environmentUrl, color: args.lightColor ?? t.resources.light.color, }; - const geoId = Model.plugin.transactions.insertGeometry(t, { modelUrl: args.modelUrl }); + const meshId = Model.plugin.transactions.insertGltfMesh(t, { url: args.modelUrl }); const offset = (args.grid - 1) / 2; for (let x = 0; x < args.grid; x++) { for (let z = 0; z < args.grid; z++) { Model.plugin.transactions.insertModel(t, { - geometry: geoId, + mesh: meshId, position: [(x - offset) * args.spacing, 0, (z - offset) * args.spacing], }); } } t.resources.orbit = { ...t.resources.orbit, - fitGeometry: geoId, + fitMesh: meshId, fitRadiusOffset: offset * args.spacing, fitRadiusFactor: 2, fitHeightFactor: 0.5, fitCenter: [0, 0, 0], }; - return geoId; + return meshId; }, }, }); diff --git a/packages/data-gpu-samples/src/samples/pbr-model-ibl/pbr-model-ibl-service.ts b/packages/data-gpu-samples/src/samples/pbr-model-ibl/pbr-model-ibl-service.ts index 1d9c5259..4408057c 100644 --- a/packages/data-gpu-samples/src/samples/pbr-model-ibl/pbr-model-ibl-service.ts +++ b/packages/data-gpu-samples/src/samples/pbr-model-ibl/pbr-model-ibl-service.ts @@ -1,16 +1,15 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. import { Database } from "@adobe/data/ecs"; -import { Vec3 } from "@adobe/data/math"; -import { pbrRender, Model, Orbit } from "@adobe/data-gpu"; +import { pbrIblRender, Model, Orbit } from "@adobe/data-gpu"; export const pbrModelIblPlugin = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrRender, Orbit.plugin), + extends: Database.Plugin.combine(pbrIblRender, Orbit.plugin), transactions: { initializeScene(t, args: { modelUrl: string; envUrl?: string; - lightColor?: Vec3; + lightColor?: readonly [number, number, number]; orbitFit?: { radiusFactor: number; heightFactor: number }; }): number { t.resources.light = { @@ -18,15 +17,15 @@ export const pbrModelIblPlugin = Database.Plugin.create({ environmentUrl: args.envUrl ?? t.resources.light.environmentUrl, color: args.lightColor ?? t.resources.light.color, }; - const geoId = Model.plugin.transactions.insertGeometry(t, { modelUrl: args.modelUrl }); - Model.plugin.transactions.insertModel(t, { geometry: geoId }); + const meshId = Model.plugin.transactions.insertGltfMesh(t, { url: args.modelUrl }); + Model.plugin.transactions.insertModel(t, { mesh: meshId }); t.resources.orbit = { ...t.resources.orbit, - fitGeometry: geoId, + fitMesh: meshId, fitRadiusFactor: args.orbitFit?.radiusFactor ?? t.resources.orbit.fitRadiusFactor, fitHeightFactor: args.orbitFit?.heightFactor ?? t.resources.orbit.fitHeightFactor, }; - return geoId; + return meshId; }, }, }); diff --git a/packages/data-gpu-samples/src/samples/ragdoll/ragdoll-service.ts b/packages/data-gpu-samples/src/samples/ragdoll/ragdoll-service.ts index a5cebf54..afde5d92 100644 --- a/packages/data-gpu-samples/src/samples/ragdoll/ragdoll-service.ts +++ b/packages/data-gpu-samples/src/samples/ragdoll/ragdoll-service.ts @@ -1,47 +1,35 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. import { Database } from "@adobe/data/ecs"; -import { pbrRender, pbrSkinning, boneColliders, joltRagdoll, physicsRenderBridge, shapeGeometry, ragdollTrigger, rapierSolver, Model, Orbit } from "@adobe/data-gpu"; +import { pbrFactorRender, requireMaterial, pbrSkinning, boneColliders, joltRagdoll, physicsRenderBridge, shapeGeometry, ragdollTrigger, rapierSolver, Model, Orbit } from "@adobe/data-gpu"; -/** - * ragdoll — a rigged humanoid walks, then goes limp and collapses onto the floor. - * The same scene runs **side by side on both solvers** through a shared base - * (`ragdollScene`): per-bone capsules are auto-fitted from the skin and track the - * walk, then `triggerRagdoll` flips them to dynamic so the skinned mesh flops. - * - * The two panels use **different ragdoll backends** through the same scene + - * `ragdollTrigger`: Jolt runs its **native `Ragdoll`** (`joltRagdoll` — swing-twist - * limits, parent-child collision filtering, pose-driven), while Rapier runs **our - * generic `boneColliders`** (free-ball, since Rapier's binding has no cone joint). - */ const ragdollScene = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrRender, pbrSkinning, shapeGeometry, physicsRenderBridge, ragdollTrigger, Orbit.plugin), + extends: Database.Plugin.combine(pbrFactorRender, pbrSkinning, shapeGeometry, physicsRenderBridge, ragdollTrigger, Orbit.plugin), transactions: { initializeScene(t, args: { modelUrl: string; envUrl?: string }): number { t.resources.light = { ...t.resources.light, environmentUrl: args.envUrl ?? t.resources.light.environmentUrl, color: [0.55, 0.55, 0.55] }; - const geoId = Model.plugin.transactions.insertGeometry(t, { modelUrl: args.modelUrl }); - Model.plugin.transactions.insertModel(t, { geometry: geoId, position: [0, 0.9, 0] }); // lifted, so the ragdoll drops onto the floor + const meshId = Model.plugin.transactions.insertGltfMesh(t, { url: args.modelUrl }); + Model.plugin.transactions.insertModel(t, { mesh: meshId, position: [0, 0.9, 0] }); t.archetypes.StaticCollider.insert({ - colliderShape: "box", halfExtents: [4, 0.25, 4], material: t.resources.materials.stone, + colliderShape: "box", halfExtents: [4, 0.25, 4], material: requireMaterial(t, "stone"), position: [0, -0.25, 0], rotation: [0, 0, 0, 1], }); t.resources.orbit = { ...t.resources.orbit, center: [0, 0.4, 0], radius: 3.2, height: 1.4, autoSpinSpeed: 0.15 }; - return geoId; + return meshId; }, }, systems: { - // Start the model's first clip looping once skeleton + clips have loaded. autoplayAnimation: { schedule: { during: ["update"] }, create: db => { const started = new Set(); return () => { - for (const arch of db.store.queryArchetypes(["_skeletonJoints", "_skeletonGeometry"])) { - const ids = arch.columns.id, jc = arch.columns._skeletonJoints, gc = arch.columns._skeletonGeometry; + for (const arch of db.store.queryArchetypes(["_skeletonJoints", "_skeletonMesh"])) { + const ids = arch.columns.id, jc = arch.columns._skeletonJoints, mc = arch.columns._skeletonMesh; for (let i = 0; i < arch.rowCount; i++) { const skeleton = ids.get(i); if (started.has(skeleton)) continue; - const clips = (db.store.read(gc.get(i)) as { _animationClipRefs?: number[] } | null)?._animationClipRefs ?? []; + const clips = (db.store.read(mc.get(i)) as { animationClipRefs?: number[] } | null)?.animationClipRefs ?? []; if (clips.length === 0) continue; db.store.archetypes.Animation.insert({ animationClipRef: clips[0], animationTargets: [...jc.get(i)], @@ -53,7 +41,6 @@ const ragdollScene = Database.Plugin.create({ }; }, }, - // Walk for a few seconds, then go limp (the active ragdoll backend handles it). autoRagdoll: { schedule: { during: ["update"] }, create: db => { @@ -69,4 +56,4 @@ const ragdollScene = Database.Plugin.create({ }); export const ragdollRapierPlugin = Database.Plugin.combine(ragdollScene, boneColliders, rapierSolver); -export const ragdollJoltPlugin = Database.Plugin.combine(ragdollScene, joltRagdoll); // joltRagdoll brings joltSolver +export const ragdollJoltPlugin = Database.Plugin.combine(ragdollScene, joltRagdoll); diff --git a/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-debug-render.ts b/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-debug-render.ts index 5405e92f..4228c209 100644 --- a/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-debug-render.ts +++ b/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-debug-render.ts @@ -8,8 +8,8 @@ import { rigidStackShader } from "./rigid-stack-render.wgsl.js"; * The original lightweight debug renderer for rigid-stack — flat Lambertian, * bodies tinted by their material's baseColorFactor and brightened by speed, * geometry vertex-pulled from packed instance buffers. Kept as a selectable - * alternative to `pbrRender`: combine `rigidStackDebugRender` instead of - * `pbrRender` (and drop shapeGeometry/physicsRenderBridge) to use it. + * alternative to `pbrFactorRender`: combine `rigidStackDebugRender` instead of + * `pbrFactorRender` (and drop shapeGeometry/physicsRenderBridge) to use it. */ const POSITION_STRIDE = 12; const CUBE_STRIDE = 24; diff --git a/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-service.ts b/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-service.ts index 01fb2711..b6aad43e 100644 --- a/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-service.ts +++ b/packages/data-gpu-samples/src/samples/rigid-stack/rigid-stack-service.ts @@ -2,7 +2,7 @@ import { Database, type Entity } from "@adobe/data/ecs"; import { Quat } from "@adobe/data/math"; -import { pbrRender, rapierSolver, joltSolver, shapeGeometry, physicsRenderBridge, modelCollider, jointData, ColliderShape, Orbit } from "@adobe/data-gpu"; +import { pbrFactorRender, requireMaterial, rapierSolver, joltSolver, shapeGeometry, physicsRenderBridge, modelCollider, jointData, ColliderShape, Orbit, standardMaterialNames, Model } from "@adobe/data-gpu"; // Studio HDR for IBL © Poly Haven, CC0. const ENV_URL = "https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/studio_small_09_1k.hdr"; @@ -86,7 +86,7 @@ const DROPS: Drop[] = (() => { * side. The drop sequence is deterministic (seeded), so both see it identically. */ const rigidStackScene = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrRender, shapeGeometry, physicsRenderBridge, modelCollider, jointData, Orbit.plugin), + extends: Database.Plugin.combine(pbrFactorRender, shapeGeometry, physicsRenderBridge, modelCollider, jointData, Orbit.plugin), resources: { _spawnAccum: { default: 0 as number, transient: true }, _spawnElapsed: { default: 0 as number, transient: true }, @@ -107,7 +107,7 @@ const rigidStackScene = Database.Plugin.create({ // Stone bin: a floor slab (top face at y = 0) and four walls, all // immovable StaticCollider boxes. The render bridge gives them // geometry once the shape meshes load — no separate render-only prop. - const stone = t.resources.materials.stone; + const stone = requireMaterial(t, "stone"); const wall = (position: [number, number, number], halfExtents: [number, number, number]) => t.archetypes.StaticCollider.insert({ colliderShape: "box", halfExtents, material: stone, position, rotation: IDENTITY }); wall([0, -0.5, 0], [BIN + 1, 0.5, BIN + 1]); // floor slab (top at y = 0) @@ -120,7 +120,7 @@ const rigidStackScene = Database.Plugin.create({ // dropped bodies land on it and slide down. World-space verts; up-facing // winding so it renders (front faces) and collides (trimesh is two-sided). t.archetypes.MeshCollider.insert({ - colliderShape: "mesh", halfExtents: [0, 0, 0], material: t.resources.materials.steel, + colliderShape: "mesh", halfExtents: [0, 0, 0], material: requireMaterial(t, "steel"), position: [0, 0, 0], rotation: IDENTITY, colliderMesh: { // sloped quad in the left zone: high at the −x wall, low toward centre @@ -131,7 +131,7 @@ const rigidStackScene = Database.Plugin.create({ // Dynamic block stack: a grid of unit cubes resting on the floor. // A small gap on every axis avoids initial face-coincidence // (degenerate SAT normals); they settle into contact. - const wood = t.resources.materials.wood; + const wood = requireMaterial(t, "wood"); const GAP = 1.04; const x0 = -(STACK_W - 1) / 2 * GAP, z0 = -(STACK_D - 1) / 2 * GAP; for (let y = 0; y < STACK_H; y++) { @@ -149,7 +149,7 @@ const rigidStackScene = Database.Plugin.create({ // its pose is authored each frame by the `sweep` system; the solver moves // it as a kinematic body that pushes the dynamics but is never pushed back. t.resources._sweeper = t.archetypes.RigidBody.insert({ - bodyType: "kinematic", colliderShape: "box", halfExtents: [0.4, 1.0, BIN - 1], material: t.resources.materials.steel, + bodyType: "kinematic", colliderShape: "box", halfExtents: [0.4, 1.0, BIN - 1], material: requireMaterial(t, "steel"), position: [SWEEP_CX - SWEEP_AMP, SWEEP_Y, 0], rotation: IDENTITY, linearVelocity: [0, 0, 0], angularVelocity: [0, 0, 0], }); // A downloaded glTF model dropped as dynamic bodies: it renders in full @@ -157,11 +157,11 @@ const rigidStackScene = Database.Plugin.create({ // (colliderShape "hull" + no collision data ⇒ modelCollider fills it). One // shared Geometry, three staggered instances. (To hand-author the collider // instead, pass `convexPoints`/`colliderMesh` here and generation is skipped.) - const helmet = t.archetypes.Geometry.insert({ modelUrl: HELMET_URL }); + const helmet = Model.plugin.transactions.insertGltfMesh(t, { url: HELMET_URL }); for (let i = 0; i < 3; i++) { t.archetypes.ModelBody.insert({ - geometry: helmet, scale: [1.5, 1.5, 1.5], visible: true, parent: 0, - bodyType: "dynamic", colliderShape: "hull", halfExtents: [0, 0, 0], material: t.resources.materials.steel, + mesh: helmet, scale: [1.5, 1.5, 1.5], visible: true, parent: 0, + bodyType: "dynamic", colliderShape: "hull", halfExtents: [0, 0, 0], material: requireMaterial(t, "steel"), position: [SPAWN_CX - 2 + i * 2, 15 + i * 5, -1 + i], rotation: randomQuat(seededRng(0x5eed + i)), linearVelocity: [0, 0, 0], angularVelocity: [0, 0, 0], }); @@ -172,7 +172,7 @@ const rigidStackScene = Database.Plugin.create({ // anchors coincide in world space, so the chain forms taut. const LINK_HY = 0.4, LINK_R = 0.22, LINK_END = LINK_HY + LINK_R, LINK_LEN = 2 * LINK_END; const CX = SWEEP_CX, CZ = BIN - 3, ANCHOR_Y = 9, ANCHOR_HH = 0.25; - const steel = t.resources.materials.steel; + const steel = requireMaterial(t, "steel"); const anchor = t.archetypes.StaticCollider.insert({ colliderShape: "box", halfExtents: [0.3, ANCHOR_HH, 0.3], material: steel, position: [CX, ANCHOR_Y, CZ], rotation: IDENTITY, @@ -213,7 +213,7 @@ const rigidStackScene = Database.Plugin.create({ }, spawnBody(t, args: { index: number }) { const d = DROPS[args.index]; - const material = Object.values(t.resources.materials)[args.index % Object.keys(t.resources.materials).length]; + const material = requireMaterial(t, standardMaterialNames[args.index % standardMaterialNames.length]); const common = { bodyType: "dynamic" as const, colliderShape: d.shape, halfExtents: d.he, material, position: d.pos, rotation: d.quat, linearVelocity: [0, 0, 0] as [number, number, number], angularVelocity: [0, 0, 0] as [number, number, number], diff --git a/packages/data-gpu-samples/src/samples/skinned-fox/skinned-fox-service.ts b/packages/data-gpu-samples/src/samples/skinned-fox/skinned-fox-service.ts index 2ffd6503..3d2a3b8f 100644 --- a/packages/data-gpu-samples/src/samples/skinned-fox/skinned-fox-service.ts +++ b/packages/data-gpu-samples/src/samples/skinned-fox/skinned-fox-service.ts @@ -2,10 +2,10 @@ import { Database } from "@adobe/data/ecs"; import { Vec3 } from "@adobe/data/math"; -import { pbrRender, pbrSkinning, Model, Orbit } from "@adobe/data-gpu"; +import { pbrIblRender, pbrSkinning, Model, Orbit } from "@adobe/data-gpu"; export const skinnedFoxPlugin = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrRender, pbrSkinning, Orbit.plugin), + extends: Database.Plugin.combine(pbrIblRender, pbrSkinning, Orbit.plugin), transactions: { initializeScene(t, args: { modelUrl: string; @@ -18,15 +18,15 @@ export const skinnedFoxPlugin = Database.Plugin.create({ environmentUrl: args.envUrl ?? t.resources.light.environmentUrl, color: args.lightColor ?? t.resources.light.color, }; - const geoId = Model.plugin.transactions.insertGeometry(t, { modelUrl: args.modelUrl }); - Model.plugin.transactions.insertModel(t, { geometry: geoId }); + const meshId = Model.plugin.transactions.insertGltfMesh(t, { url: args.modelUrl }); + Model.plugin.transactions.insertModel(t, { mesh: meshId }); t.resources.orbit = { ...t.resources.orbit, - fitGeometry: geoId, + fitMesh: meshId, fitRadiusFactor: args.orbitFit?.radiusFactor ?? t.resources.orbit.fitRadiusFactor, fitHeightFactor: args.orbitFit?.heightFactor ?? t.resources.orbit.fitHeightFactor, }; - return geoId; + return meshId; }, }, }); diff --git a/packages/data-gpu-samples/src/samples/solar-system/solar-system-service.ts b/packages/data-gpu-samples/src/samples/solar-system/solar-system-service.ts index 2c6b8795..0cb1f0e8 100644 --- a/packages/data-gpu-samples/src/samples/solar-system/solar-system-service.ts +++ b/packages/data-gpu-samples/src/samples/solar-system/solar-system-service.ts @@ -6,7 +6,7 @@ import { animation, Model, Orbit, - pbrRender, + pbrIblRender, picking, type AnimationTrack, } from "@adobe/data-gpu"; @@ -40,7 +40,7 @@ interface PlanetSpec { } export const solarSystemPlugin = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrRender, sphere, animation, Orbit.plugin, picking), + extends: Database.Plugin.combine(pbrIblRender, sphere, animation, Orbit.plugin, picking), transactions: { initializeScene(t) { t.resources.orbit = { @@ -61,7 +61,7 @@ export const solarSystemPlugin = Database.Plugin.create({ segments: 64, }); const planetId = Model.plugin.transactions.insertModel(t, { - geometry: geo, + mesh: geo, position: spec.position, scale: spec.scale, parent: spec.parent ?? 0, @@ -120,8 +120,8 @@ export const solarSystemPlugin = Database.Plugin.create({ pickAndFit(db, args: { x: number; y: number }) { const hit = db.actions.pickFromScreen(args); if (!hit) return; - const geo = db.read(hit.entity)?.geometry; - if (geo) db.transactions.setOrbit({ fitGeometry: geo }); + const mesh = db.read(hit.entity)?.mesh; + if (mesh) db.transactions.setOrbit({ fitMesh: mesh }); }, }, }); diff --git a/packages/data-gpu-samples/src/samples/solar-system/sphere-plugin.ts b/packages/data-gpu-samples/src/samples/solar-system/sphere-plugin.ts index 0a593e61..011fbad3 100644 --- a/packages/data-gpu-samples/src/samples/solar-system/sphere-plugin.ts +++ b/packages/data-gpu-samples/src/samples/solar-system/sphere-plugin.ts @@ -2,7 +2,7 @@ import { Database } from "@adobe/data/ecs"; import { Mat4x4 } from "@adobe/data/math"; -import { pbrCore, core, VisibleMaterial } from "@adobe/data-gpu"; +import { pbrCore, core, mesh, VisibleMaterial } from "@adobe/data-gpu"; import { createSphereBuffers } from "./create-sphere.js"; interface SphereSpec extends VisibleMaterial.ColorMaterialOptions { @@ -10,14 +10,17 @@ interface SphereSpec extends VisibleMaterial.ColorMaterialOptions { segments: number; } +const unitSphereBounds = { + min: [-1, -1, -1] as const, + max: [1, 1, 1] as const, +}; + /** - * Sample-local plugin: lets the solar-system author `Sphere` entities with a - * color/material spec. A system materializes each into the GPU primitives the - * PBR renderer consumes, so the resulting entity id can be referenced as a - * Model's `geometry`. + * Sample-local plugin: `Sphere` entities with a color/material spec bake into + * `StaticMesh` + `_PbrPrimitive` for the IBL renderer. */ export const sphere = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrCore, core), + extends: Database.Plugin.combine(pbrCore, core, mesh), components: { sphereSpec: { default: null as unknown as SphereSpec }, }, @@ -36,22 +39,23 @@ export const sphere = Database.Plugin.create({ }; return t.archetypes.Sphere.insert({ sphereSpec: spec }); }, - _insertSphereGeometry(t, args: { - geometry: number; + _insertSphereMesh(t, args: { + mesh: number; materialBindGroup: GPUBindGroup; vertexBuffer: GPUBuffer; indexBuffer: GPUBuffer; indexCount: number; indexFormat: GPUIndexFormat; }) { + t.update(args.mesh, { localBounds: unitSphereBounds }); const materialId = t.archetypes._VisibleMaterial.insert({ ephemeral: true, _materialBindGroup: args.materialBindGroup, - _geometry: args.geometry, + _mesh: args.mesh, }); t.archetypes._PbrPrimitive.insert({ ephemeral: true, - _geometry: args.geometry, + _mesh: args.mesh, _material: materialId, _vertexBuffer: args.vertexBuffer, _skinVertexBuffer: null, @@ -80,8 +84,8 @@ export const sphere = Database.Plugin.create({ const spec = specs.get(i) as SphereSpec; const geo = createSphereBuffers(device, spec.rings, spec.segments); const materialBindGroup = VisibleMaterial.createColorBindGroup(device, spec); - db.transactions._insertSphereGeometry({ - geometry: id, + db.transactions._insertSphereMesh({ + mesh: id, materialBindGroup, vertexBuffer: geo.vertexBuffer, indexBuffer: geo.indexBuffer, diff --git a/packages/data-gpu/scripts/flatten-mechs-definitions.mjs b/packages/data-gpu/scripts/flatten-mechs-definitions.mjs new file mode 100644 index 00000000..72b2c356 --- /dev/null +++ b/packages/data-gpu/scripts/flatten-mechs-definitions.mjs @@ -0,0 +1,69 @@ +/** + * One-off: flatten mechs definitions.ts (materialFlags packs) → data-gpu flat definitions.ts + * Run: node scripts/flatten-mechs-definitions.mjs + */ +import { readFileSync, writeFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { dirname, join } from "node:path"; + +const root = join(dirname(fileURLToPath(import.meta.url)), ".."); +const src = readFileSync( + join(root, "src/material/definitions.ts"), + "utf8", +); + +const parseFlags = (block) => { + const num = (key) => { + const m = block.match(new RegExp(`${key}:\\s*([\\d.]+)`)); + return m ? m[1] : "0"; + }; + return ` metallicFactor: ${num("metallic")},\n roughnessFactor: ${num("roughness")},\n irReflectance: ${num("irReflectance")},\n irEmission: ${num("irEmission")},\n emissionMode: ${num("emissionMode")},\n restitution: ${num("restitution")},`; +}; + +let out = src + .replace( + /import type \{ MaterialDefinition \} from "\.\/material-definition\.js";\nimport \{ MaterialFlags \} from "\.\.\/material-flags\/material-flags\.js";\nimport \{ StressStrainCurve \} from "\.\.\/stress-strain-curve\/stress-strain-curve\.js";/, + `import type { MaterialDefinition } from "./material-definition.js";\nimport { StressStrainCurve } from "./stress-strain-curve/stress-strain-curve.js";\n\nconst defaultSolid = {\n friction: 0.5,\n compliance: 1e-8,\n normalScale: 1,\n occlusionStrength: 1,\n baseColorUrl: "",\n metallicRoughnessUrl: "",\n normalUrl: "",\n occlusionUrl: "",\n emissiveUrl: "",\n} as const satisfies Partial;`, + ) + .replace(/StressStrainCurve/g, "StressStrainCurve") + .replace(/\.\.\/stress-strain-curve\/stress-strain-curve\.js/g, "./stress-strain-curve/stress-strain-curve.js") + .replace(/baseColor:/g, "baseColorFactor:") + .replace(/emissionRgb:/g, "emissiveFactor:") + .replace(/specificHeatCapacity:/g, "heatCapacity:") + .replace( + /const metaMaterialBase: Omit = \{[\s\S]*?\};/, + `const metaMaterialBase: Omit = { + metallicFactor: 0.8, + roughnessFactor: 0.2, + irReflectance: 0.5, + irEmission: 0, + emissionMode: 0, + restitution: 0.35, + emissiveFactor: [0, 0, 0], + density: 1200, + viscosity: 0, + heatCapacity: Number.POSITIVE_INFINITY, + thermalConductivity: 100, + ...defaultSolid, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.01333, 40], + tensileFractureStrainStress: [0.08, 48], + compressiveYieldStrainStress: [-0.015, -45], + compressiveFractureStrainStress: [-0.09, -52], + }), +};`, + ); + +out = out.replace( + /materialFlags: MaterialFlags\.create\(\{[\s\S]*?\}\),?\n/g, + (match) => parseFlags(match) + "\n", +); + +// Spread defaultSolid into entries that use ...noSolidCurve (fluids) +out = out.replace( + /(\.\.\.noSolidCurve,)/g, + "...defaultSolid,\n ...noSolidCurve,", +); + +writeFileSync(join(root, "src/material/definitions.ts"), out); +console.log("Wrote src/material/definitions.ts"); diff --git a/packages/data-gpu/src/graphics/camera/orbit/orbit-data-plugin.ts b/packages/data-gpu/src/graphics/camera/orbit/orbit-data-plugin.ts index 6bd4d126..72af2dca 100644 --- a/packages/data-gpu/src/graphics/camera/orbit/orbit-data-plugin.ts +++ b/packages/data-gpu/src/graphics/camera/orbit/orbit-data-plugin.ts @@ -21,7 +21,7 @@ export const orbitData = Database.Plugin.create({ autoSpinSpeed: 0.5, nearFactor: 0.01, farFactor: 4, - fitGeometry: 0, + fitMesh: 0, fitRadiusFactor: 1.5, fitHeightFactor: 0.25, fitRadiusOffset: 0, diff --git a/packages/data-gpu/src/graphics/camera/orbit/orbit-system-plugin.ts b/packages/data-gpu/src/graphics/camera/orbit/orbit-system-plugin.ts index 06121c45..896506fc 100644 --- a/packages/data-gpu/src/graphics/camera/orbit/orbit-system-plugin.ts +++ b/packages/data-gpu/src/graphics/camera/orbit/orbit-system-plugin.ts @@ -9,8 +9,8 @@ import { orbitData } from "./orbit-data-plugin.js"; * * - **_orbitCameraSystem**: updates camera position/target/near/far from the * orbit polar coords; auto-spins when `orbit.autoSpin` is true. - * - **_orbitAutoFitSystem**: when `orbit.fitGeometry` is non-zero, reads that - * Geometry's `_bounds`, sizes the orbit to fit, and zeroes the field. + * - **_orbitAutoFitSystem**: when `orbit.fitMesh` is non-zero, reads that + * mesh's `localBounds`, sizes the orbit to fit, and zeroes the field. */ export const orbitSystem = Database.Plugin.create({ extends: orbitData, @@ -43,12 +43,9 @@ export const orbitSystem = Database.Plugin.create({ _orbitAutoFitSystem: { create: db => () => { const orbit = db.store.resources.orbit; - if (!orbit.fitGeometry) return; - // orbit.fitGeometry holds a Geometry entity id. `_bounds` lives - // on modelLoader's schema, which orbit doesn't extend — read as - // unknown and narrow manually. - const entity = db.store.read(orbit.fitGeometry) as { _bounds?: Aabb } | null; - const bounds = entity?._bounds; + if (!orbit.fitMesh) return; + const entity = db.store.read(orbit.fitMesh) as { localBounds?: Aabb } | null; + const bounds = entity?.localBounds; if (!bounds) return; const size = Math.max( bounds.max[0] - bounds.min[0], @@ -65,7 +62,7 @@ export const orbitSystem = Database.Plugin.create({ center, radius: size * orbit.fitRadiusFactor + orbit.fitRadiusOffset, height: size * orbit.fitHeightFactor, - fitGeometry: 0, + fitMesh: 0, }; }, schedule: { during: ["preUpdate"] }, diff --git a/packages/data-gpu/src/graphics/camera/orbit/orbit.ts b/packages/data-gpu/src/graphics/camera/orbit/orbit.ts index 78748ca8..1ed6b7f2 100644 --- a/packages/data-gpu/src/graphics/camera/orbit/orbit.ts +++ b/packages/data-gpu/src/graphics/camera/orbit/orbit.ts @@ -4,7 +4,7 @@ import type { Vec3 } from "@adobe/data/math"; /** * Orbit camera state — a polar arrangement around a center point with an - * auto-spin and a one-shot auto-fit to a Geometry's bounds. + * auto-spin and a one-shot auto-fit to a mesh asset's `localBounds`. * * - `center` / `radius` / `height` / `angle` define the camera placement. * - `nearFactor` / `farFactor` scale the near and far planes so they @@ -12,9 +12,9 @@ import type { Vec3 } from "@adobe/data/math"; * clipping). * - `autoSpin` / `autoSpinSpeed` rotate the camera each frame when the * user isn't dragging. - * - `fitGeometry` is an entity id; when non-zero, the auto-fit system - * reads that Geometry's bounds on the first available frame, sizes the - * orbit, and zeros the field. `fitRadiusFactor` / `fitHeightFactor` / + * - `fitMesh` is an entity id; when non-zero, the auto-fit system reads that + * mesh's `localBounds` on the first available frame, sizes the orbit, and + * zeroes the field. `fitRadiusFactor` / `fitHeightFactor` / * `fitRadiusOffset` / `fitCenter` shape the fit. */ export interface Orbit { @@ -26,7 +26,7 @@ export interface Orbit { autoSpinSpeed: number; nearFactor: number; farFactor: number; - fitGeometry: number; + fitMesh: number; fitRadiusFactor: number; fitHeightFactor: number; fitRadiusOffset: number; diff --git a/packages/data-gpu/src/graphics/picking/picking-plugin.ts b/packages/data-gpu/src/graphics/picking/picking-plugin.ts index ff6a6b04..c583fc2d 100644 --- a/packages/data-gpu/src/graphics/picking/picking-plugin.ts +++ b/packages/data-gpu/src/graphics/picking/picking-plugin.ts @@ -35,18 +35,18 @@ const pickingBase = Database.Plugin.create({ pickable: True.schema, }, archetypes: { - PickableModel: ["geometry", "position", "rotation", "scale", "visible", "parent", "pickable"], + PickableModel: ["mesh", "position", "rotation", "scale", "visible", "parent", "pickable"], }, transactions: { insertPickableModel(t, args: { - geometry: number; + mesh: number; position?: readonly [number, number, number]; rotation?: readonly [number, number, number, number]; scale?: readonly [number, number, number]; parent?: number; }): number { return t.archetypes.PickableModel.insert({ - geometry: args.geometry, + mesh: args.mesh, position: args.position ?? [0, 0, 0], rotation: args.rotation ?? [0, 0, 0, 1], scale: args.scale ?? [1, 1, 1], @@ -66,7 +66,7 @@ type PickingDB = Database.Plugin.ToDatabase; const pickRayImpl = (db: PickingDB, ray: Line3): PickHit | null => { let best: PickHit | null = null; for (const arch of db.queryArchetypes([ - "geometry", "visible", "pickable", "_worldBounds", + "mesh", "visible", "pickable", "_worldBounds", ])) { const ids = arch.columns.id; const vis = arch.columns.visible; diff --git a/packages/data-gpu/src/graphics/rendering/bone-collider-plugin.ts b/packages/data-gpu/src/graphics/rendering/bone-collider-plugin.ts index d6003402..c365f4d1 100644 --- a/packages/data-gpu/src/graphics/rendering/bone-collider-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/bone-collider-plugin.ts @@ -10,6 +10,7 @@ import { ragdollTrigger } from "./ragdoll-trigger-plugin.js"; import { pbrSkinning } from "./skinning/skinning-plugin.js"; import { modelLoader } from "../scene/model/model-loader-plugin.js"; import { transform } from "../scene/node/transform-plugin.js"; +import { requireMaterial } from "../../material/require-material.js"; /** * boneColliders — fits a capsule to each bone of a skinned model and ragdolls it. @@ -44,7 +45,10 @@ function rotationOf(m: Mat4x4): Quat { const s = Math.sqrt(1 + m22 - m00 - m11) * 2; return [(m02 + m20) / s, (m12 + m21) / s, 0.25 * s, (m10 - m01) / s]; } -interface SkinGeometry { _cpuSkin?: { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null; _skinInverseBindMatrices?: Float32Array | null } +interface SkinMesh { + cpuSkin?: { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null; + skinInverseBindMatrices?: Float32Array | null; +} export const boneColliders = Database.Plugin.create({ extends: Database.Plugin.combine(physicsData, jointData, ragdollTrigger, pbrSkinning, modelLoader, transform), @@ -65,14 +69,14 @@ export const boneColliders = Database.Plugin.create({ generateBoneColliders: { schedule: { during: ["postUpdate"] }, create: db => () => { - const material = (Object.values(db.store.resources.materials)[0] as Entity | undefined) ?? (0 as Entity); - for (const arch of db.store.queryArchetypes(["_skeletonJoints", "_skeletonGeometry"], { exclude: ["_ragdollBuilt"] })) { - const ids = arch.columns.id, jc = arch.columns._skeletonJoints, gc = arch.columns._skeletonGeometry; + const material = requireMaterial(db, "steel"); + for (const arch of db.store.queryArchetypes(["_skeletonJoints", "_skeletonMesh"], { exclude: ["_ragdollBuilt"] })) { + const ids = arch.columns.id, jc = arch.columns._skeletonJoints, mc = arch.columns._skeletonMesh; for (let i = arch.rowCount - 1; i >= 0; i--) { - const skeleton = ids.get(i), joints = jc.get(i), geo = gc.get(i); - const g = db.store.read(geo) as SkinGeometry | null; - if (!g?._cpuSkin || !g._skinInverseBindMatrices) continue; // skin not loaded yet - for (const c of fitBoneCapsules({ jointCount: joints.length, inverseBindMatrices: g._skinInverseBindMatrices, skin: g._cpuSkin })) { + const skeleton = ids.get(i), joints = jc.get(i), meshId = mc.get(i); + const g = db.store.read(meshId) as SkinMesh | null; + if (!g?.cpuSkin || !g.skinInverseBindMatrices) continue; + for (const c of fitBoneCapsules({ jointCount: joints.length, inverseBindMatrices: g.skinInverseBindMatrices, skin: g.cpuSkin })) { db.store.archetypes.BoneCapsule.insert({ bodyType: "kinematic", colliderShape: "capsule", halfExtents: [c.radius, c.halfHeight, 0], material, collisionGroup: 1, position: [0, 0, 0], rotation: [0, 0, 0, 1], linearVelocity: [0, 0, 0], angularVelocity: [0, 0, 0], diff --git a/packages/data-gpu/src/graphics/rendering/ibl-render/ibl-render-plugin.ts b/packages/data-gpu/src/graphics/rendering/ibl-render/ibl-render-plugin.ts index 6d0f2a1f..559686eb 100644 --- a/packages/data-gpu/src/graphics/rendering/ibl-render/ibl-render-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/ibl-render/ibl-render-plugin.ts @@ -264,18 +264,18 @@ export const pbrIblRender = Database.Plugin.create({ // from each Model's `_worldMatrix` component (written by _transform). interface ModelEntry { id: number; matrix: Mat4x4 } const modelsByGeo = new Map(); - for (const arch of db.store.queryArchetypes(["geometry", "visible", "_worldMatrix"])) { + for (const arch of db.store.queryArchetypes(["mesh", "visible", "_worldMatrix"])) { const ids = arch.columns.id; - const geoRefs = arch.columns.geometry; + const meshRefs = arch.columns.mesh; const vis = arch.columns.visible; const worldMats = arch.columns._worldMatrix; for (let i = 0; i < arch.rowCount; i++) { if (!vis.get(i)) continue; const id = ids.get(i); const m = worldMats.get(i); - const geoId = geoRefs.get(i); - let arr = modelsByGeo.get(geoId); - if (!arr) { arr = []; modelsByGeo.set(geoId, arr); } + const meshId = meshRefs.get(i); + let arr = modelsByGeo.get(meshId); + if (!arr) { arr = []; modelsByGeo.set(meshId, arr); } arr.push({ id, matrix: m }); } } @@ -315,7 +315,7 @@ export const pbrIblRender = Database.Plugin.create({ "_indexCount", "_indexFormat", "_material", - "_geometry", + "_mesh", "_nodeLocalMatrix", ])) { const vbs = archetype.columns._vertexBuffer; @@ -324,12 +324,12 @@ export const pbrIblRender = Database.Plugin.create({ const counts = archetype.columns._indexCount; const formats = archetype.columns._indexFormat; const matRefs = archetype.columns._material; - const geoRefs = archetype.columns._geometry; + const meshRefs = archetype.columns._mesh; const nodeMats = archetype.columns._nodeLocalMatrix; const primIds = archetype.columns.id; for (let i = 0; i < archetype.rowCount; i++) { - const geoId = geoRefs.get(i); - const models = modelsByGeo.get(geoId); + const meshId = meshRefs.get(i); + const models = modelsByGeo.get(meshId); if (!models) continue; const skinBuf = skinVbs.get(i); diff --git a/packages/data-gpu/src/graphics/rendering/jolt-ragdoll-plugin.ts b/packages/data-gpu/src/graphics/rendering/jolt-ragdoll-plugin.ts index 4f583ce1..1aa9bef5 100644 --- a/packages/data-gpu/src/graphics/rendering/jolt-ragdoll-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/jolt-ragdoll-plugin.ts @@ -26,7 +26,11 @@ import type { JointTemplate } from "../scene/model/gltf/parse-skin.js"; */ type Jolt = JoltContext["jolt"]; -interface SkinGeo { _cpuSkin?: { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null; _skinInverseBindMatrices?: Float32Array | null; _skinJointTemplate?: JointTemplate[] } +interface SkinGeo { + cpuSkin?: { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null; + skinInverseBindMatrices?: Float32Array | null; + skinJointTemplate?: JointTemplate[]; +} /** Column-major rigid transform from a position + unit quaternion. */ const compose = (px: number, py: number, pz: number, q: ArrayLike): Mat4x4 => @@ -63,9 +67,9 @@ export const joltRagdoll = Database.Plugin.create({ const jointWorld = (j: Entity): Mat4x4 => (db.store.get(j, "_worldMatrix") as Mat4x4 | undefined) ?? Mat4x4.identity; const build = (ctx: JoltContext, jointIds: readonly Entity[], g: SkinGeo): void => { - const jolt = ctx.jolt, template = g._skinJointTemplate!; + const jolt = ctx.jolt, template = g.skinJointTemplate!; const caps = new Map(); - for (const c of fitBoneCapsules({ jointCount: jointIds.length, inverseBindMatrices: g._skinInverseBindMatrices!, skin: g._cpuSkin! })) + for (const c of fitBoneCapsules({ jointCount: jointIds.length, inverseBindMatrices: g.skinInverseBindMatrices!, skin: g.cpuSkin! })) caps.set(c.jointIndex, { radius: c.radius, halfHeight: c.halfHeight, offPos: c.offsetPosition, offRot: c.offsetRotation }); const skel = new jolt.Skeleton(); @@ -123,11 +127,11 @@ export const joltRagdoll = Database.Plugin.create({ const ctx = db.store.resources._joltContext; if (!ctx) return; if (!built) { - for (const arch of db.store.queryArchetypes(["_skeletonJoints", "_skeletonGeometry"])) { - const jc = arch.columns._skeletonJoints, gc = arch.columns._skeletonGeometry; + for (const arch of db.store.queryArchetypes(["_skeletonJoints", "_skeletonMesh"])) { + const jc = arch.columns._skeletonJoints, mc = arch.columns._skeletonMesh; for (let i = 0; i < arch.rowCount; i++) { - const g = db.store.read(gc.get(i)) as SkinGeo | null; - if (!g?._cpuSkin || !g._skinInverseBindMatrices || !g._skinJointTemplate?.length) continue; + const g = db.store.read(mc.get(i)) as SkinGeo | null; + if (!g?.cpuSkin || !g.skinInverseBindMatrices || !g.skinJointTemplate?.length) continue; build(ctx, jc.get(i), g); built = true; break; } if (built) break; diff --git a/packages/data-gpu/src/graphics/rendering/material-gpu/material-arrays.ts b/packages/data-gpu/src/graphics/rendering/material-gpu/material-arrays.ts deleted file mode 100644 index cd3b00d4..00000000 --- a/packages/data-gpu/src/graphics/rendering/material-gpu/material-arrays.ts +++ /dev/null @@ -1,113 +0,0 @@ -// © 2026 Adobe. MIT License. See /LICENSE for details. - -/** - * The shared GPU material set: five `texture_2d_array`s (one per PBR map) plus - * a palette storage buffer of per-layer factors. Every material occupies one - * layer across all five arrays; a drawable selects its material with a single - * per-instance layer index. Built once and grown by layer — materials are - * added rarely and edited never, so nothing here is rebuilt per frame. - */ -export interface MaterialArrays { - baseColor: GPUTexture; // rgba8unorm-srgb - metallicRoughness: GPUTexture; // rgba8unorm (G = roughness, B = metalness) - normal: GPUTexture; // rgba8unorm - occlusion: GPUTexture; // rgba8unorm (R = AO) - emissive: GPUTexture; // rgba8unorm-srgb -} - -/** Fixed layer size every material map is resampled to. */ -export const MATERIAL_TEXTURE_SIZE = 512; -/** Maximum distinct materials (array layers). 16 × 512² × 5 maps ≈ 80 MB. */ -export const MAX_MATERIAL_LAYERS = 16; -/** Bytes per palette entry: baseColor(vec4) + emissive/metallic(vec4) + rough/normal/occlusion(vec4). */ -export const PALETTE_STRIDE = 48; - -export function createMaterialArrays(device: GPUDevice): MaterialArrays { - const make = (format: GPUTextureFormat): GPUTexture => - device.createTexture({ - size: [MATERIAL_TEXTURE_SIZE, MATERIAL_TEXTURE_SIZE, MAX_MATERIAL_LAYERS], - dimension: "2d", - format, - // RENDER_ATTACHMENT is required by copyExternalImageToTexture. - usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, - }); - return { - baseColor: make("rgba8unorm-srgb"), - metallicRoughness: make("rgba8unorm"), - normal: make("rgba8unorm"), - occlusion: make("rgba8unorm"), - emissive: make("rgba8unorm-srgb"), - }; -} - -/** Per-material visible factors written into one palette layer. */ -export interface MaterialFactors { - baseColorFactor: readonly number[]; - emissiveFactor: readonly number[]; - metallicFactor: number; - roughnessFactor: number; - normalScale: number; - occlusionStrength: number; -} - -const _palette = new Float32Array(PALETTE_STRIDE / 4); - -export function writePaletteLayer(device: GPUDevice, palette: GPUBuffer, layer: number, f: MaterialFactors): void { - _palette[0] = f.baseColorFactor[0]; _palette[1] = f.baseColorFactor[1]; _palette[2] = f.baseColorFactor[2]; _palette[3] = f.baseColorFactor[3]; - _palette[4] = f.emissiveFactor[0]; _palette[5] = f.emissiveFactor[1]; _palette[6] = f.emissiveFactor[2]; _palette[7] = f.metallicFactor; - _palette[8] = f.roughnessFactor; _palette[9] = f.normalScale; _palette[10] = f.occlusionStrength; _palette[11] = 0; - device.queue.writeBuffer(palette, layer * PALETTE_STRIDE, _palette); -} - -/** The five map source URLs for one material ("" = leave the neutral layer). */ -export interface MaterialMapUrls { - baseColorUrl: string; - metallicRoughnessUrl: string; - normalUrl: string; - occlusionUrl: string; - emissiveUrl: string; -} - -/** - * Fetches a material's maps and blits them (resampled to the layer size) into - * its array layer. Fire-and-forget: each map resolves independently, so a body - * renders (neutral) immediately and sharpens as textures arrive. URLs shared - * across maps (e.g. an ARM image used for both metallicRoughness and occlusion) - * are fetched once and copied to each target. - */ -export function loadMaterialMaps(device: GPUDevice, arrays: MaterialArrays, layer: number, urls: MaterialMapUrls): void { - const targets: { url: string; tex: GPUTexture }[] = [ - { url: urls.baseColorUrl, tex: arrays.baseColor }, - { url: urls.metallicRoughnessUrl, tex: arrays.metallicRoughness }, - { url: urls.normalUrl, tex: arrays.normal }, - { url: urls.occlusionUrl, tex: arrays.occlusion }, - { url: urls.emissiveUrl, tex: arrays.emissive }, - ]; - const byUrl = new Map(); - for (const t of targets) { - if (!t.url) continue; - const list = byUrl.get(t.url); - if (list) list.push(t.tex); - else byUrl.set(t.url, [t.tex]); - } - for (const [url, texes] of byUrl) { - fetch(url) - .then(r => { if (!r.ok) throw new Error(`material map ${r.status}: ${url}`); return r.blob(); }) - .then(blob => createImageBitmap(blob, { - resizeWidth: MATERIAL_TEXTURE_SIZE, - resizeHeight: MATERIAL_TEXTURE_SIZE, - colorSpaceConversion: "none", - })) - .then(bitmap => { - for (const tex of texes) { - device.queue.copyExternalImageToTexture( - { source: bitmap }, - { texture: tex, origin: [0, 0, layer] }, - [MATERIAL_TEXTURE_SIZE, MATERIAL_TEXTURE_SIZE, 1], - ); - } - bitmap.close(); - }) - .catch(err => console.warn("[materialGpu] map load failed", err)); - } -} diff --git a/packages/data-gpu/src/graphics/rendering/material-gpu/material-bind-group.ts b/packages/data-gpu/src/graphics/rendering/material-gpu/material-bind-group.ts deleted file mode 100644 index c894dd13..00000000 --- a/packages/data-gpu/src/graphics/rendering/material-gpu/material-bind-group.ts +++ /dev/null @@ -1,61 +0,0 @@ -// © 2026 Adobe. MIT License. See /LICENSE for details. - -import type { MaterialArrays } from "./material-arrays.js"; - -interface DeviceCache { - layout: GPUBindGroupLayout; - sampler: GPUSampler; -} -const cacheByDevice = new WeakMap(); - -function deviceCache(device: GPUDevice): DeviceCache { - let c = cacheByDevice.get(device); - if (!c) { - const tex = (binding: number): GPUBindGroupLayoutEntry => ({ - binding, visibility: GPUShaderStage.FRAGMENT, - texture: { sampleType: "float", viewDimension: "2d-array" }, - }); - c = { - layout: device.createBindGroupLayout({ - entries: [ - { binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: "read-only-storage" } }, - tex(1), tex(2), tex(3), tex(4), tex(5), - { binding: 6, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } }, - ], - }), - sampler: device.createSampler({ - magFilter: "linear", minFilter: "linear", mipmapFilter: "linear", - addressModeU: "repeat", addressModeV: "repeat", - }), - }; - cacheByDevice.set(device, c); - } - return c; -} - -/** - * Bind-group layout for the shared material set: palette storage buffer + - * five `texture_2d_array`s + a filtering sampler. The renderer's primitive - * pipeline builds its pipeline layout from this; `createMaterialBindGroup` - * builds the matching bind group. Cached per device. - */ -export function createMaterialBindGroupLayout(device: GPUDevice): GPUBindGroupLayout { - return deviceCache(device).layout; -} - -export function createMaterialBindGroup(device: GPUDevice, arrays: MaterialArrays, palette: GPUBuffer): GPUBindGroup { - const { layout, sampler } = deviceCache(device); - const view = (t: GPUTexture): GPUTextureView => t.createView({ dimension: "2d-array" }); - return device.createBindGroup({ - layout, - entries: [ - { binding: 0, resource: { buffer: palette } }, - { binding: 1, resource: view(arrays.baseColor) }, - { binding: 2, resource: view(arrays.metallicRoughness) }, - { binding: 3, resource: view(arrays.normal) }, - { binding: 4, resource: view(arrays.occlusion) }, - { binding: 5, resource: view(arrays.emissive) }, - { binding: 6, resource: sampler }, - ], - }); -} diff --git a/packages/data-gpu/src/graphics/rendering/material-gpu/material-gpu-plugin.ts b/packages/data-gpu/src/graphics/rendering/material-gpu/material-gpu-plugin.ts deleted file mode 100644 index 9ee1cfe2..00000000 --- a/packages/data-gpu/src/graphics/rendering/material-gpu/material-gpu-plugin.ts +++ /dev/null @@ -1,95 +0,0 @@ -// © 2026 Adobe. MIT License. See /LICENSE for details. - -import { Database } from "@adobe/data/ecs"; -import { U32 } from "@adobe/data/math"; -import { core } from "../../../core/core-plugin.js"; -import { Material } from "../../../material/material.js"; -import { - type MaterialArrays, - MAX_MATERIAL_LAYERS, PALETTE_STRIDE, - createMaterialArrays, writePaletteLayer, loadMaterialMaps, -} from "./material-arrays.js"; -import { createMaterialBindGroup } from "./material-bind-group.js"; - -/** Material rows the builder reads to fill a layer (factors + map URLs). */ -const MATERIAL_COMPONENTS = [ - "baseColorFactor", "emissiveFactor", "metallicFactor", "roughnessFactor", "normalScale", "occlusionStrength", - "baseColorUrl", "metallicRoughnessUrl", "normalUrl", "occlusionUrl", "emissiveUrl", -] as const; - -/** - * materialGpu — derives the shared GPU material set from the `Material` - * registry. Each authored material is assigned one array layer; its factors go - * into the palette buffer and its maps are fetched + blitted into that layer. - * - * Incremental and cached: the arrays / palette / bind group are built once, and - * a layer is assigned only to a material that doesn't have one yet (`_layerIndex` - * excluded). Materials are added rarely and edited never, so steady state does - * no work. The renderer (P3) binds `_materialBindGroup` once and selects a - * material per instance by `_layerIndex`. - */ -export const materialGpu = Database.Plugin.create({ - extends: Database.Plugin.combine(Material.plugin, core), - components: { - _layerIndex: U32.schema, - }, - resources: { - _materialArrays: { default: null as MaterialArrays | null, transient: true }, - _materialPalette: { default: null as GPUBuffer | null, transient: true }, - _materialBindGroup: { default: null as GPUBindGroup | null, transient: true }, - }, - systems: { - materialGpuBuilder: { - schedule: { during: ["preRender"] }, - create: db => { - let arrays: MaterialArrays | null = null; - let palette: GPUBuffer | null = null; - let nextLayer = 0; - return () => { - const { device } = db.store.resources; - if (!device) return; - - // Assign a layer to each material that lacks one. Tail→head: - // every visited row migrates out (gains _layerIndex), so the - // removal is always from the tail — no hole-fill shift. The GPU - // arrays are created lazily on the first material, so glTF-only - // scenes (no materials) allocate nothing. - for (const arch of db.store.queryArchetypes(["name", ...MATERIAL_COMPONENTS], { exclude: ["_layerIndex"] })) { - const c = arch.columns; - for (let i = arch.rowCount - 1; i >= 0; i--) { - if (nextLayer >= MAX_MATERIAL_LAYERS) break; - if (!arrays || !palette) { - arrays = createMaterialArrays(device); - palette = device.createBuffer({ - size: MAX_MATERIAL_LAYERS * PALETTE_STRIDE, - usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST, - }); - db.store.resources._materialArrays = arrays; - db.store.resources._materialPalette = palette; - db.store.resources._materialBindGroup = createMaterialBindGroup(device, arrays, palette); - } - const id = c.id.get(i); - const layer = nextLayer++; - writePaletteLayer(device, palette, layer, { - baseColorFactor: c.baseColorFactor.get(i), - emissiveFactor: c.emissiveFactor.get(i), - metallicFactor: c.metallicFactor.get(i), - roughnessFactor: c.roughnessFactor.get(i), - normalScale: c.normalScale.get(i), - occlusionStrength: c.occlusionStrength.get(i), - }); - loadMaterialMaps(device, arrays, layer, { - baseColorUrl: c.baseColorUrl.get(i), - metallicRoughnessUrl: c.metallicRoughnessUrl.get(i), - normalUrl: c.normalUrl.get(i), - occlusionUrl: c.occlusionUrl.get(i), - emissiveUrl: c.emissiveUrl.get(i), - }); - db.store.update(id, { _layerIndex: layer }); - } - } - }; - }, - }, - }, -}); diff --git a/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu-plugin.ts b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu-plugin.ts new file mode 100644 index 00000000..5cb5dde9 --- /dev/null +++ b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu-plugin.ts @@ -0,0 +1,86 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import { Database } from "@adobe/data/ecs"; +import { U32 } from "@adobe/data/math"; +import { core } from "../../../core/core-plugin.js"; +import { Material } from "../../../material/material.js"; +import { + MAX_FACTOR_PALETTE_ENTRIES, + PALETTE_STRIDE, + materialHasMaps, + writePaletteLayer, +} from "./material-palette.js"; +import { createFactorPaletteBindGroup } from "./palette-bind-group.js"; + +/** Material rows the factor builder reads (PBR factors only — no map URLs). */ +const FACTOR_MATERIAL_COMPONENTS = [ + "baseColorFactor", "emissiveFactor", "metallicFactor", "roughnessFactor", "normalScale", "occlusionStrength", + "irEmission", "emissionMode", + "baseColorUrl", "metallicRoughnessUrl", "normalUrl", "occlusionUrl", "emissiveUrl", +] as const; + +/** + * materialPaletteGpu — uploads factor-only materials into a shared palette buffer. + * Materials with any map URL are skipped (no map upload path — use factor rows or glTF). + * Each factor material gets `_paletteIndex`; no texture arrays are allocated. + */ +export const materialPaletteGpu = Database.Plugin.create({ + extends: Database.Plugin.combine(Material.plugin, core), + components: { + _paletteIndex: U32.schema, + }, + resources: { + _factorPalette: { default: null as GPUBuffer | null, transient: true }, + _factorPaletteBindGroup: { default: null as GPUBindGroup | null, transient: true }, + }, + systems: { + materialPaletteGpuBuilder: { + schedule: { during: ["preRender"] }, + create: db => { + let palette: GPUBuffer | null = null; + let nextIndex = 0; + return () => { + const { device } = db.store.resources; + if (!device) return; + + for (const arch of db.store.queryArchetypes(["name", ...FACTOR_MATERIAL_COMPONENTS], { exclude: ["_paletteIndex"] })) { + const c = arch.columns; + for (let i = arch.rowCount - 1; i >= 0; i--) { + const urls = { + baseColorUrl: c.baseColorUrl.get(i), + metallicRoughnessUrl: c.metallicRoughnessUrl.get(i), + normalUrl: c.normalUrl.get(i), + occlusionUrl: c.occlusionUrl.get(i), + emissiveUrl: c.emissiveUrl.get(i), + }; + if (materialHasMaps(urls)) continue; + if (nextIndex >= MAX_FACTOR_PALETTE_ENTRIES) break; + + if (!palette) { + palette = device.createBuffer({ + size: MAX_FACTOR_PALETTE_ENTRIES * PALETTE_STRIDE, + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST, + }); + db.store.resources._factorPalette = palette; + db.store.resources._factorPaletteBindGroup = createFactorPaletteBindGroup(device, palette); + } + + const index = nextIndex++; + writePaletteLayer(device, palette, index, { + baseColorFactor: c.baseColorFactor.get(i), + emissiveFactor: c.emissiveFactor.get(i), + metallicFactor: c.metallicFactor.get(i), + roughnessFactor: c.roughnessFactor.get(i), + normalScale: c.normalScale.get(i), + occlusionStrength: c.occlusionStrength.get(i), + irEmission: c.irEmission.get(i), + emissionMode: c.emissionMode.get(i), + }); + db.store.update(c.id.get(i), { _paletteIndex: index }); + } + } + }; + }, + }, + }, +}); diff --git a/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu.test.ts b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu.test.ts new file mode 100644 index 00000000..3cb10510 --- /dev/null +++ b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette-gpu.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; +import { materialHasMaps } from "./material-palette.js"; + +const emptyUrls = { + baseColorUrl: "", + metallicRoughnessUrl: "", + normalUrl: "", + occlusionUrl: "", + emissiveUrl: "", +}; + +describe("materialHasMaps", () => { + it("is false when all URLs are empty", () => { + expect(materialHasMaps(emptyUrls)).toBe(false); + }); + + it("is true when any URL is set", () => { + expect(materialHasMaps({ ...emptyUrls, baseColorUrl: "https://example.com/a.jpg" })).toBe(true); + }); +}); diff --git a/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette.ts b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette.ts new file mode 100644 index 00000000..9da53c50 --- /dev/null +++ b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/material-palette.ts @@ -0,0 +1,41 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +/** Bytes per palette entry: 4 × vec4 (base, emissive/metal, rough/normal/occlusion/ir, emission meta). */ +export const PALETTE_STRIDE = 64; + +/** Factor-only materials — palette rows only, no map memory. */ +export const MAX_FACTOR_PALETTE_ENTRIES = 256; + +/** Per-material visible factors written into one palette row. */ +export interface MaterialFactors { + baseColorFactor: readonly number[]; + emissiveFactor: readonly number[]; + metallicFactor: number; + roughnessFactor: number; + normalScale: number; + occlusionStrength: number; + irEmission: number; + emissionMode: number; +} + +const _palette = new Float32Array(PALETTE_STRIDE / 4); + +export function writePaletteLayer(device: GPUDevice, palette: GPUBuffer, index: number, f: MaterialFactors): void { + _palette[0] = f.baseColorFactor[0]; _palette[1] = f.baseColorFactor[1]; _palette[2] = f.baseColorFactor[2]; _palette[3] = f.baseColorFactor[3]; + _palette[4] = f.emissiveFactor[0]; _palette[5] = f.emissiveFactor[1]; _palette[6] = f.emissiveFactor[2]; _palette[7] = f.metallicFactor; + _palette[8] = f.roughnessFactor; _palette[9] = f.normalScale; _palette[10] = f.occlusionStrength; _palette[11] = f.irEmission; + _palette[12] = f.emissionMode; _palette[13] = 0; _palette[14] = 0; _palette[15] = 0; + device.queue.writeBuffer(palette, index * PALETTE_STRIDE, _palette); +} + +/** The five map source URLs for one material ("" = factor-only). */ +export interface MaterialMapUrls { + baseColorUrl: string; + metallicRoughnessUrl: string; + normalUrl: string; + occlusionUrl: string; + emissiveUrl: string; +} + +export const materialHasMaps = (urls: MaterialMapUrls): boolean => + !!(urls.baseColorUrl || urls.metallicRoughnessUrl || urls.normalUrl || urls.occlusionUrl || urls.emissiveUrl); diff --git a/packages/data-gpu/src/graphics/rendering/material-palette-gpu/palette-bind-group.ts b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/palette-bind-group.ts new file mode 100644 index 00000000..a982530e --- /dev/null +++ b/packages/data-gpu/src/graphics/rendering/material-palette-gpu/palette-bind-group.ts @@ -0,0 +1,24 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +const layoutByDevice = new WeakMap(); + +/** Bind-group layout for factor PBR: palette storage buffer only (group 1). */ +export function createFactorPaletteBindGroupLayout(device: GPUDevice): GPUBindGroupLayout { + let layout = layoutByDevice.get(device); + if (!layout) { + layout = device.createBindGroupLayout({ + entries: [ + { binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: "read-only-storage" } }, + ], + }); + layoutByDevice.set(device, layout); + } + return layout; +} + +export function createFactorPaletteBindGroup(device: GPUDevice, palette: GPUBuffer): GPUBindGroup { + return device.createBindGroup({ + layout: createFactorPaletteBindGroupLayout(device), + entries: [{ binding: 0, resource: { buffer: palette } }], + }); +} diff --git a/packages/data-gpu/src/graphics/rendering/model-collider-plugin.ts b/packages/data-gpu/src/graphics/rendering/model-collider-plugin.ts index a2dd6109..29001f89 100644 --- a/packages/data-gpu/src/graphics/rendering/model-collider-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/model-collider-plugin.ts @@ -7,64 +7,48 @@ import { modelLoader } from "../scene/model/model-loader-plugin.js"; import { hullVertices } from "../scene/model/shape/convex-hull.js"; /** - * modelCollider — lets a rendered model double as a physics body whose collider is - * **auto-generated from its mesh**. A `ModelBody` (or `StaticModelCollider`) carries - * a `geometry` + a `colliderShape` of `"hull"` or `"mesh"` but *no* collision data; - * this fills it once the mesh has loaded: - * - * hull → `convexPoints` = the simplified hull vertices of the mesh (the engine - * rebuilds the hull) — a coarse, convex stand-in for a detailed model. - * mesh → `colliderMesh` = the mesh triangles verbatim (static trimesh). - * - * The source defaults to the body's own `geometry` but can be overridden with - * `collisionGeometry` (point it at a low-poly mesh for a cheaper collider). The - * model's `scale` is baked into the collision geometry so it matches the render. - * Generated data is cached per (source geometry, shape, scale), so many instances - * of one model share it. Authoring the collider by hand (supplying `convexPoints` - * / `colliderMesh` directly, as `ConvexBody` / `MeshCollider` do) still works and - * simply skips generation. - * - * Because the body already has a `geometry`, the physics render bridge leaves it - * alone — it renders as the detailed model and collides as the generated shape. + * modelCollider — auto-generates physics colliders from loaded mesh CPU data. */ export const modelCollider = Database.Plugin.create({ extends: Database.Plugin.combine(physicsData, modelLoader), components: { - collisionGeometry: Entity.schema, // optional override: generate the collider from this Geometry instead of `geometry` + collisionMesh: Entity.schema, }, archetypes: { - // A model that is also a dynamic/kinematic body; collider auto-generated. - ModelBody: ["geometry", "scale", "visible", "parent", "bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity"], - // A static model collider (immovable level geometry that renders as a model). - StaticModelCollider: ["geometry", "scale", "visible", "parent", "colliderShape", "halfExtents", "material", "position", "rotation"], + ModelBody: ["mesh", "scale", "visible", "parent", "bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity"], + StaticModelCollider: ["mesh", "scale", "visible", "parent", "colliderShape", "halfExtents", "material", "position", "rotation"], }, systems: { generateModelColliders: { schedule: { during: ["postUpdate"] }, create: db => { - // generated collider data, shared across instances of the same (source mesh, shape, scale) const cache = new Map(); return () => { - // model-bodies (geometry + scale) whose collider data isn't generated yet - for (const arch of db.store.queryArchetypes(["colliderShape", "geometry", "scale"], { exclude: ["convexPoints", "colliderMesh"] })) { + for (const arch of db.store.queryArchetypes(["colliderShape", "mesh", "scale"], { exclude: ["convexPoints", "colliderMesh"] })) { const ids = arch.columns.id, css = arch.columns.colliderShape, scl = arch.columns.scale; - // tail→head: filling the data migrates the row out of this archetype for (let i = arch.rowCount - 1; i >= 0; i--) { const shape = css.get(i); - if (shape !== "hull" && shape !== "mesh") continue; // primitive-shaped model-bodies need no generation + if (shape !== "hull" && shape !== "mesh") continue; const id = ids.get(i); - const src = (db.store.read(id) as { collisionGeometry?: Entity }).collisionGeometry || arch.columns.geometry.get(i); - const mesh = db.store.read(src) as { _cpuPositions?: Float32Array | null; _cpuIndices?: Uint32Array | null } | null; - const positions = mesh?._cpuPositions; - if (!positions) continue; // source mesh not loaded yet — retry next frame + const src = (db.store.read(id) as { collisionMesh?: Entity }).collisionMesh ?? arch.columns.mesh.get(i); + const asset = db.store.read(src) as { + cpuCollisionPositions?: Float32Array | null; + cpuCollisionIndices?: Uint32Array | null; + } | null; + const positions = asset?.cpuCollisionPositions; + if (!positions) continue; const s = scl.get(i), key = `${src}:${shape}:${s[0]}:${s[1]}:${s[2]}`; let data = cache.get(key); if (!data) { const scaled = new Float32Array(positions.length); - for (let k = 0; k < positions.length; k += 3) { scaled[k] = positions[k] * s[0]; scaled[k + 1] = positions[k + 1] * s[1]; scaled[k + 2] = positions[k + 2] * s[2]; } + for (let k = 0; k < positions.length; k += 3) { + scaled[k] = positions[k] * s[0]; + scaled[k + 1] = positions[k + 1] * s[1]; + scaled[k + 2] = positions[k + 2] * s[2]; + } data = shape === "hull" ? { convexPoints: hullVertices(scaled) } - : { colliderMesh: { positions: scaled, indices: mesh!._cpuIndices ?? new Uint32Array(0) } }; + : { colliderMesh: { positions: scaled, indices: asset!.cpuCollisionIndices ?? new Uint32Array(0) } }; cache.set(key, data); } db.store.update(id, data); diff --git a/packages/data-gpu/src/graphics/rendering/pbr-core-plugin.ts b/packages/data-gpu/src/graphics/rendering/pbr-core-plugin.ts index 8dc3b8aa..bfafa14c 100644 --- a/packages/data-gpu/src/graphics/rendering/pbr-core-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/pbr-core-plugin.ts @@ -5,11 +5,8 @@ import { Mat4x4 } from "@adobe/data/math"; import { U32 } from "@adobe/data/math"; /** - * Shape declarations shared between asset producers (model loader, shape - * generators) and consumers (renderers). Every component and archetype is - * ephemeral — not part of the user's data model. Pair with an asset - * producer plus a renderer aggregator (`pbrIblRender`) - * to get drawable scenes. + * Ephemeral GPU mesh payloads shared between asset producers (glTF loader, + * shape baker) and renderers. Not part of the authored asset model. */ export const pbrCore = Database.Plugin.create({ components: { @@ -22,8 +19,8 @@ export const pbrCore = Database.Plugin.create({ _indexFormat: { default: "uint16" as GPUIndexFormat }, _materialBindGroup: { default: null as GPUBindGroup | null }, /** Back-reference from a _PbrPrimitive / _VisibleMaterial to the - * authored Geometry that owns it. */ - _geometry: Entity.schema, + * baked mesh asset that owns it. */ + _mesh: Entity.schema, _material: Entity.schema, /** Node-local-to-model-root matrix baked at load time. The renderer * pre-multiplies it with the per-instance model-root world matrix. */ @@ -34,7 +31,7 @@ export const pbrCore = Database.Plugin.create({ _skeletonJointMatrixBindGroup: { default: null as GPUBindGroup | null }, }, archetypes: { - _VisibleMaterial: ["ephemeral", "_materialBindGroup", "_geometry"], - _PbrPrimitive: ["ephemeral", "_vertexBuffer", "_skinVertexBuffer", "_indexBuffer", "_indexCount", "_indexFormat", "_material", "_geometry", "_nodeLocalMatrix"], + _VisibleMaterial: ["ephemeral", "_materialBindGroup", "_mesh"], + _PbrPrimitive: ["ephemeral", "_vertexBuffer", "_skinVertexBuffer", "_indexBuffer", "_indexCount", "_indexFormat", "_material", "_mesh", "_nodeLocalMatrix"], }, }); diff --git a/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-render-plugin.ts b/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-factor-render-plugin.ts similarity index 53% rename from packages/data-gpu/src/graphics/rendering/pbr-render/pbr-render-plugin.ts rename to packages/data-gpu/src/graphics/rendering/pbr-render/pbr-factor-render-plugin.ts index 3c3c12f6..6ab94719 100644 --- a/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-render-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-factor-render-plugin.ts @@ -2,79 +2,37 @@ import { Database, type Entity } from "@adobe/data/ecs"; import { pbrIblRender } from "../ibl-render/ibl-render-plugin.js"; -import { materialGpu } from "../material-gpu/material-gpu-plugin.js"; +import { materialPaletteGpu } from "../material-palette-gpu/material-palette-gpu-plugin.js"; import { displayTransform } from "../display-transform-plugin.js"; import { SceneUniforms } from "../../scene/scene-uniforms/scene-uniforms.js"; import { StandardVertex } from "../standard-vertex/standard-vertex.js"; -import { createMaterialBindGroupLayout } from "../material-gpu/material-bind-group.js"; -import { buildPbrArrayShader } from "./pbr-array-shader.wgsl.js"; - -// Must match pbrIblRender's bake so the array shader's prefiltered-mip math agrees. -const PREFILTERED_MIP_COUNT = 7; - -/** Drawable: any visible entity with a geometry ref, a transform, and a material. */ -const DRAWABLE = ["geometry", "visible", "position", "rotation", "scale", "material"] as const; -// Bodies carrying a derived display pose (interpolation-plugin) draw at it instead -// of the canonical pose; everything else (statics, props, non-physics instances) -// draws straight from position/rotation. Splitting the gather by archetype shape -// avoids a per-row "has display pose?" branch. -const DRAWABLE_INTERP = [...DRAWABLE, "_renderPosition", "_renderRotation"] as const; -const DRAWABLE_DIRECT = { exclude: ["_renderPosition"] } as const; -const PRIMITIVE = ["_vertexBuffer", "_indexBuffer", "_indexCount", "_indexFormat", "_geometry", "_nodeLocalMatrix"] as const; - -/** Minimal column shape the gather reads — satisfied by either query's columns. */ -interface Col { get(i: number): T } - -function createIblBindGroupLayout(device: GPUDevice): GPUBindGroupLayout { - return device.createBindGroupLayout({ - entries: [ - { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } }, - { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } }, - { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } }, - { binding: 3, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } }, - ], - }); -} +import { createFactorPaletteBindGroupLayout } from "../material-palette-gpu/palette-bind-group.js"; +import { buildPbrFactorShader } from "./pbr-factor-shader.wgsl.js"; +import { + composeTrs, + createIblBindGroupLayout, + DRAWABLE, + DRAWABLE_DIRECT, + DRAWABLE_INTERP, + PREFILTERED_MIP_COUNT, + PRIMITIVE, + type ColumnReader, + type MeshBatch, +} from "./primitive-render-shared.js"; + +interface InstCache { buffer: GPUBuffer; indexBuffer: GPUBuffer; bindGroup: GPUBindGroup; capacity: number } /** - * Compose a column-major TRS matrix directly into `out[o..o+15]` — no - * allocation, reading position/rotation/scale straight from their column typed - * arrays. Matches `translation · Quat.toMat4 · scaling`. Runs once per visible - * drawable per frame, so the array churn of the math-helper form matters. - */ -function composeTrs( - out: Float32Array, o: number, - p: ArrayLike, pi: number, q: ArrayLike, qi: number, s: ArrayLike, si: number, -): void { - const qx = q[qi], qy = q[qi + 1], qz = q[qi + 2], qw = q[qi + 3]; - const sx = s[si], sy = s[si + 1], sz = s[si + 2]; - const xx = qx * qx, yy = qy * qy, zz = qz * qz; - const xy = qx * qy, xz = qx * qz, yz = qy * qz; - const wx = qw * qx, wy = qw * qy, wz = qw * qz; - out[o] = (1 - 2 * (yy + zz)) * sx; out[o + 1] = (2 * (xy + wz)) * sx; out[o + 2] = (2 * (xz - wy)) * sx; out[o + 3] = 0; - out[o + 4] = (2 * (xy - wz)) * sy; out[o + 5] = (1 - 2 * (xx + zz)) * sy; out[o + 6] = (2 * (yz + wx)) * sy; out[o + 7] = 0; - out[o + 8] = (2 * (xz + wy)) * sz; out[o + 9] = (2 * (yz - wx)) * sz; out[o + 10] = (1 - 2 * (xx + yy)) * sz; out[o + 11] = 0; - out[o + 12] = p[pi]; out[o + 13] = p[pi + 1]; out[o + 14] = p[pi + 2]; out[o + 15] = 1; -} - -/** - * pbrRender — the single PBR + IBL renderer. It extends `pbrIblRender`, reusing - * its IBL bake, skybox, scene/material bind groups and glTF draw path verbatim, - * and adds one extra draw query for **instanced primitives** whose material - * comes from the shared `materialGpu` arrays (selected per instance by the - * material entity's `_layerIndex`). Two efficient queries, one render plugin: - * - * - glTF models → per-material bind group, native-resolution textures (pbrIblRender) - * - primitives → shared texture_2d_array + per-instance layer (this system) + * pbrFactorRender — instanced primitive PBR from material factors only (no map + * sampling). Extends `pbrIblRender` for IBL + skybox + optional glTF draws. + * Pairs with `materialPaletteGpu` (`_paletteIndex` on factor materials). * - * The primitive system runs after `pbrIblRenderSystem` so the skybox is drawn - * first. World matrices are computed directly from `position`/`rotation`/`scale` - * (primitives are flat — no hierarchy), so it's independent of `transform`. + * Pairs with `materialPaletteGpu` (`_paletteIndex`). Idle when no factor materials or drawables exist. */ -export const pbrRender = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrIblRender, materialGpu, displayTransform), +export const pbrFactorRender = Database.Plugin.create({ + extends: Database.Plugin.combine(pbrIblRender, materialPaletteGpu, displayTransform), systems: { - pbrPrimitiveRenderSystem: { + pbrFactorPrimitiveRenderSystem: { schedule: { during: ["render"], after: ["beginRenderPass", "pbrIblRenderSystem"], before: ["endRenderPass"] }, create: db => { let pipeline: GPURenderPipeline | null = null; @@ -87,25 +45,21 @@ export const pbrRender = Database.Plugin.create({ let cachedSceneBuffer: GPUBuffer | null = null; let cachedIrradiance: GPUTexture | null = null; - let matLayer = new Map(); + const matIndex = new Map(); let matCount = -1; - interface Inst { buffer: GPUBuffer; layerBuffer: GPUBuffer; bindGroup: GPUBindGroup; capacity: number } - const instCache = new Map(); + const instCache = new Map(); let matScratch = new Float32Array(16); - let layerScratch = new Uint32Array(1); - // Per-frame matrix arena (composed TRS, one mat4 per drawable) + per-geometry - // draw lists (matrix offset + layer). All pooled and reused across frames — - // the gather runs over every visible body each frame, so zero allocation here. + let indexScratch = new Uint32Array(1); let mats = new Float32Array(64 * 16); - const batches = new Map(); + const batches = new Map(); return () => { const { device, renderPassEncoder, canvasFormat, depthFormat, _sceneUniformsBuffer, - _materialBindGroup, _iblIrradiance, _iblPrefiltered, _iblBrdfLut, + _factorPaletteBindGroup, _iblIrradiance, _iblPrefiltered, _iblBrdfLut, } = db.store.resources; - if (!device || !renderPassEncoder || !_sceneUniformsBuffer || !_materialBindGroup) return; + if (!device || !renderPassEncoder || !_sceneUniformsBuffer || !_factorPaletteBindGroup) return; if (!_iblIrradiance || !_iblPrefiltered || !_iblBrdfLut) return; if (!sceneLayout) sceneLayout = SceneUniforms.createBindGroupLayout(device); @@ -121,9 +75,11 @@ export const pbrRender = Database.Plugin.create({ addressModeU: "clamp-to-edge", addressModeV: "clamp-to-edge", addressModeW: "clamp-to-edge", }); if (!pipeline) { - const module = device.createShaderModule({ code: buildPbrArrayShader({ prefilteredMipCount: PREFILTERED_MIP_COUNT }) }); + const module = device.createShaderModule({ code: buildPbrFactorShader({ prefilteredMipCount: PREFILTERED_MIP_COUNT }) }); pipeline = device.createRenderPipeline({ - layout: device.createPipelineLayout({ bindGroupLayouts: [sceneLayout, createMaterialBindGroupLayout(device), iblLayout, instanceLayout] }), + layout: device.createPipelineLayout({ + bindGroupLayouts: [sceneLayout, createFactorPaletteBindGroupLayout(device), iblLayout, instanceLayout], + }), vertex: { module, entryPoint: "vs_main", buffers: [StandardVertex.layout] }, fragment: { module, entryPoint: "fs_main", targets: [{ format: canvasFormat }] }, primitive: { topology: "triangle-list", cullMode: "back" }, @@ -148,62 +104,58 @@ export const pbrRender = Database.Plugin.create({ cachedIrradiance = _iblIrradiance; } - // material → layer, refreshed only when the material set grows let mc = 0; - for (const arch of db.store.queryArchetypes(["_layerIndex"])) mc += arch.rowCount; + for (const arch of db.store.queryArchetypes(["_paletteIndex"])) mc += arch.rowCount; if (mc !== matCount) { - matLayer = new Map(); - for (const arch of db.store.queryArchetypes(["_layerIndex"])) { - const id = arch.columns.id, li = arch.columns._layerIndex; - for (let i = 0; i < arch.rowCount; i++) matLayer.set(id.get(i), li.get(i)); + matIndex.clear(); + for (const arch of db.store.queryArchetypes(["_paletteIndex"])) { + const id = arch.columns.id, pi = arch.columns._paletteIndex; + for (let i = 0; i < arch.rowCount; i++) matIndex.set(id.get(i), pi.get(i)); } matCount = mc; } - // Gather visible primitive drawables grouped by geometry. Compose each - // world matrix straight from the chosen pose/scale column typed arrays - // into the pooled `mats` arena — no per-row array allocation. Two passes: - // bodies with a display pose use it; everything else uses position/rotation. - for (const b of batches.values()) { b.off.length = 0; b.layer.length = 0; } + for (const b of batches.values()) { b.off.length = 0; b.materialIndex.length = 0; } let drawCount = 0; const gather = ( - rowCount: number, vis: Col, geo: Col, mat: Col, + rowCount: number, vis: ColumnReader, meshCol: ColumnReader, mat: ColumnReader, posArr: ArrayLike, rotArr: ArrayLike, sclArr: ArrayLike, ): void => { for (let i = 0; i < rowCount; i++) { if (!vis.get(i)) continue; - const layer = matLayer.get(mat.get(i)); - if (layer === undefined) continue; + const paletteIndex = matIndex.get(mat.get(i)); + if (paletteIndex === undefined) continue; if ((drawCount + 1) * 16 > mats.length) { const grown = new Float32Array(mats.length * 2); grown.set(mats); mats = grown; } composeTrs(mats, drawCount * 16, posArr, i * 3, rotArr, i * 4, sclArr, i * 3); - const g = geo.get(i); + const g = meshCol.get(i); let b = batches.get(g); - if (!b) { b = { off: [], layer: [] }; batches.set(g, b); } - b.off.push(drawCount); b.layer.push(layer); + if (!b) { b = { off: [], materialIndex: [] }; batches.set(g, b); } + b.off.push(drawCount); + b.materialIndex.push(paletteIndex); drawCount++; } }; for (const arch of db.store.queryArchetypes(DRAWABLE_INTERP)) { - gather(arch.rowCount, arch.columns.visible, arch.columns.geometry, arch.columns.material, + gather(arch.rowCount, arch.columns.visible, arch.columns.mesh, arch.columns.material, arch.columns._renderPosition.getTypedArray(), arch.columns._renderRotation.getTypedArray(), arch.columns.scale.getTypedArray()); } for (const arch of db.store.queryArchetypes(DRAWABLE, DRAWABLE_DIRECT)) { - gather(arch.rowCount, arch.columns.visible, arch.columns.geometry, arch.columns.material, + gather(arch.rowCount, arch.columns.visible, arch.columns.mesh, arch.columns.material, arch.columns.position.getTypedArray(), arch.columns.rotation.getTypedArray(), arch.columns.scale.getTypedArray()); } if (drawCount === 0) return; renderPassEncoder.setPipeline(pipeline); renderPassEncoder.setBindGroup(0, sceneBindGroup); - renderPassEncoder.setBindGroup(1, _materialBindGroup); + renderPassEncoder.setBindGroup(1, _factorPaletteBindGroup); renderPassEncoder.setBindGroup(2, iblBindGroup); for (const arch of db.store.queryArchetypes(PRIMITIVE)) { const vbs = arch.columns._vertexBuffer, ibs = arch.columns._indexBuffer; const counts = arch.columns._indexCount, formats = arch.columns._indexFormat; - const geoRefs = arch.columns._geometry, primIds = arch.columns.id; + const meshRefs = arch.columns._mesh, primIds = arch.columns.id; for (let i = 0; i < arch.rowCount; i++) { - const b = batches.get(geoRefs.get(i)); + const b = batches.get(meshRefs.get(i)); if (!b || b.off.length === 0) continue; const n = b.off.length; const primId = primIds.get(i); @@ -211,32 +163,29 @@ export const pbrRender = Database.Plugin.create({ let entry = instCache.get(primId); if (!entry || entry.capacity < n) { entry?.buffer.destroy(); - entry?.layerBuffer.destroy(); + entry?.indexBuffer.destroy(); const buffer = device.createBuffer({ size: Math.max(n * 64, 64), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST }); - const layerBuffer = device.createBuffer({ size: Math.max(n * 4, 4), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST }); + const indexBuffer = device.createBuffer({ size: Math.max(n * 4, 4), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST }); const bindGroup = device.createBindGroup({ layout: instanceLayout, - entries: [{ binding: 0, resource: { buffer } }, { binding: 1, resource: { buffer: layerBuffer } }], + entries: [{ binding: 0, resource: { buffer } }, { binding: 1, resource: { buffer: indexBuffer } }], }); - entry = { buffer, layerBuffer, bindGroup, capacity: n }; + entry = { buffer, indexBuffer, bindGroup, capacity: n }; instCache.set(primId, entry); } if (matScratch.length < n * 16) matScratch = new Float32Array(n * 16); - if (layerScratch.length < n) layerScratch = new Uint32Array(n); - // Copy this geometry's matrices out of the arena into a contiguous - // upload buffer. Primitive node matrices are identity (flat shapes; - // glTF hierarchy goes through pbrIblRender), so no extra multiply. + if (indexScratch.length < n) indexScratch = new Uint32Array(n); for (let j = 0; j < n; j++) { const src = b.off[j] * 16, dst = j * 16; for (let k = 0; k < 16; k++) matScratch[dst + k] = mats[src + k]; - layerScratch[j] = b.layer[j]; + indexScratch[j] = b.materialIndex[j]; } device.queue.writeBuffer(entry.buffer, 0, matScratch, 0, n * 16); - device.queue.writeBuffer(entry.layerBuffer, 0, layerScratch, 0, n); + device.queue.writeBuffer(entry.indexBuffer, 0, indexScratch, 0, n); renderPassEncoder.setBindGroup(3, entry.bindGroup); - renderPassEncoder.setVertexBuffer(0, vbs.get(i)!); // _PbrPrimitive guarantees non-null - renderPassEncoder.setIndexBuffer(ibs.get(i)!, formats.get(i)); // _PbrPrimitive guarantees non-null + renderPassEncoder.setVertexBuffer(0, vbs.get(i)!); + renderPassEncoder.setIndexBuffer(ibs.get(i)!, formats.get(i)); renderPassEncoder.drawIndexed(counts.get(i), n); } } diff --git a/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-array-shader.wgsl.ts b/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-factor-shader.wgsl.ts similarity index 59% rename from packages/data-gpu/src/graphics/rendering/pbr-render/pbr-array-shader.wgsl.ts rename to packages/data-gpu/src/graphics/rendering/pbr-render/pbr-factor-shader.wgsl.ts index d668e374..c542597a 100644 --- a/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-array-shader.wgsl.ts +++ b/packages/data-gpu/src/graphics/rendering/pbr-render/pbr-factor-shader.wgsl.ts @@ -5,13 +5,10 @@ import { schema as sceneUniformsSchema } from "../../scene/scene-uniforms/schema import brdf from "../ibl-render/brdf.wgsl.js"; /** - * Unified PBR shader for instanced primitives (and, after convergence, glTF). - * Materials come from the shared `materialGpu` set — five `texture_2d_array`s + - * a palette of per-layer factors (group 1) — selected by a per-instance layer - * index (group 3, binding 1). Shading is identical Cook-Torrance + split-sum - * IBL to the per-material `ibl-shader`; only the material *source* differs. + * Factor-only PBR for instanced primitives — palette factors + vertex normals, + * no material map sampling. Used by `pbrFactorRender`. */ -export function buildPbrArrayShader(options: { prefilteredMipCount: number }): string { +export function buildPbrFactorShader(options: { prefilteredMipCount: number }): string { return /* wgsl */ ` struct SceneUniforms { ${wgslStructFields(sceneUniformsSchema)} @@ -20,18 +17,13 @@ ${wgslStructFields(sceneUniformsSchema)} struct MaterialFactors { baseColorFactor: vec4f, emissiveMetallic: vec4f, // emissive.rgb, metallicFactor - roughNormalOcc: vec4f, // roughnessFactor, normalScale, occlusionStrength, _ + roughNormalIr: vec4f, // roughnessFactor, normalScale, occlusionStrength, irEmission + emissionMeta: vec4f, // emissionMode, _, _, _ } @group(0) @binding(0) var scene: SceneUniforms; @group(1) @binding(0) var palette: array; -@group(1) @binding(1) var baseColorArray: texture_2d_array; -@group(1) @binding(2) var metallicRoughnessArray: texture_2d_array; -@group(1) @binding(3) var normalArray: texture_2d_array; -@group(1) @binding(4) var occlusionArray: texture_2d_array; -@group(1) @binding(5) var emissiveArray: texture_2d_array; -@group(1) @binding(6) var matSampler: sampler; @group(2) @binding(0) var iblIrradiance: texture_cube; @group(2) @binding(1) var iblPrefiltered: texture_cube; @@ -39,7 +31,7 @@ struct MaterialFactors { @group(2) @binding(3) var iblSampler: sampler; @group(3) @binding(0) var instances: array>; -@group(3) @binding(1) var layers: array; +@group(3) @binding(1) var paletteIndices: array; const PREFILTERED_MIP_COUNT: f32 = ${options.prefilteredMipCount.toFixed(1)}; @@ -54,10 +46,7 @@ struct VertexOutput { @builtin(position) clipPosition: vec4f, @location(0) worldPosition: vec3f, @location(1) normal: vec3f, - @location(2) tangent: vec3f, - @location(3) bitangent: vec3f, - @location(4) uv: vec2f, - @location(5) @interpolate(flat) layer: u32, + @location(5) @interpolate(flat) paletteIndex: u32, } @vertex @@ -74,10 +63,7 @@ fn vs_main(@builtin(instance_index) instanceIndex: u32, in: VertexInput) -> Vert out.clipPosition = scene.viewProjectionMatrix * worldPos; out.worldPosition = worldPos.xyz; out.normal = normalize(normalMat * in.normal); - out.tangent = normalize(m3 * in.tangent.xyz); - out.bitangent = normalize(cross(out.normal, out.tangent) * in.tangent.w); - out.uv = in.uv; - out.layer = layers[instanceIndex]; + out.paletteIndex = paletteIndices[instanceIndex]; return out; } @@ -85,32 +71,26 @@ ${brdf} @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4f { - let f = palette[in.layer]; - let li = i32(in.layer); + let f = palette[in.paletteIndex]; - let baseColor = textureSample(baseColorArray, matSampler, in.uv, li) * f.baseColorFactor; - - let mr = textureSample(metallicRoughnessArray, matSampler, in.uv, li); - let metallic = mr.b * f.emissiveMetallic.w; - var roughness = mr.g * f.roughNormalOcc.x; + let baseColor = f.baseColorFactor; + let metallic = f.emissiveMetallic.w; + var roughness = f.roughNormalIr.x; roughness = max(roughness, MIN_ROUGHNESS); let alpha = roughness * roughness; + let occlusion = f.roughNormalIr.z; + let emissionMode = f.emissionMeta.x; + let irEmission = f.roughNormalIr.w; + // 0 = UV fluorescence (no visible add); 1 = visible luminescence (emissive + IR glow). + let emissive = select(vec3f(0.0), f.emissiveMetallic.xyz + vec3f(irEmission), emissionMode >= 0.5); - let occlusion = textureSample(occlusionArray, matSampler, in.uv, li).r; - let emissive = textureSample(emissiveArray, matSampler, in.uv, li).rgb * f.emissiveMetallic.xyz; - - let nSampled = textureSample(normalArray, matSampler, in.uv, li).rgb * 2.0 - vec3f(1.0); - let nScaled = vec3f(nSampled.xy * f.roughNormalOcc.y, nSampled.z); - let tbn = mat3x3(in.tangent, in.bitangent, in.normal); - let N = normalize(tbn * nScaled); - + let N = normalize(in.normal); let V = normalize(scene.cameraPosition - in.worldPosition); let nDotV = max(dot(N, V), 0.001); let R = reflect(-V, N); let f0 = mix(vec3f(0.04), baseColor.rgb, metallic); - // --- IBL contribution (split-sum) --- let F_ibl = f_schlick_roughness(nDotV, f0, roughness); let kD_ibl = (vec3f(1.0) - F_ibl) * (1.0 - metallic); @@ -122,9 +102,8 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4f { let envBrdf = textureSampleLevel(iblBrdfLut, iblSampler, vec2f(nDotV, roughness), 0.0).rg; let specularIbl = prefiltered * (F_ibl * envBrdf.x + envBrdf.y); - let ambient = (diffuseIbl + specularIbl) * mix(1.0, occlusion, f.roughNormalOcc.z); + let ambient = (diffuseIbl + specularIbl) * occlusion; - // --- Direct light (parity with the single scene light) --- let L = normalize(-scene.lightDirection); let H = normalize(V + L); let nDotL = max(dot(N, L), 0.0); diff --git a/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts b/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts index 6375def6..6d72b0e4 100644 --- a/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts @@ -2,101 +2,91 @@ import { Database, type Entity } from "@adobe/data/ecs"; import { physicsData } from "../../../physics/physics-data-plugin.js"; -import { model } from "../../scene/model/model-plugin.js"; +import { mesh } from "../../scene/model/mesh-plugin.js"; import { shapeGeometry } from "../../scene/model/shape/shape-geometry-plugin.js"; import { capsuleMesh, flatShadedMesh } from "../../scene/model/shape/shape-mesh.js"; import { convexHullMesh } from "../../scene/model/shape/convex-hull.js"; import { uploadShapeMesh } from "../../scene/model/shape/upload-shape-mesh.js"; +import { boundsFromShapeMesh } from "../../scene/model/shape/bounds-from-shape-mesh.js"; import type { ColliderMesh } from "../../../physics/body/collider-mesh.js"; import { interpolation } from "../interpolation-plugin.js"; /** - * physicsRenderBridge — makes colliders renderable by `pbrRender`. Once the - * shape geometries exist, every body with a collider shape (dynamic RigidBody - * or immovable StaticCollider alike) gains a `geometry` ref (sphere / cube by - * collider shape), a `scale` (its half-extents — the unit shapes are size-1), - * and `visible`. Because physics `rotation`/`position` are the same components - * the renderer reads, there is no per-frame sync: this only migrates new bodies. - * - * It also folds in `interpolation`, so dynamic bodies render at the smooth, - * render-rate display pose for free (the solver steps on a fixed clock that need - * not match the render rate) — bridging physics to the renderer is exactly when - * you want that. Use `interpolation` directly only with a custom (non-bridge) path. - * - * Also declares `Prop` — a render-only placed geometry with a material that is - * not a physics body at all (decorative scenery with no collider). + * physicsRenderBridge — makes colliders renderable by `pbrFactorRender`. Once + * shared shape meshes exist, every body with a collider shape gains a `mesh` + * ref, a `scale`, and `visible`. Dynamic bodies also get render interpolation. */ export const physicsRenderBridge = Database.Plugin.create({ - extends: Database.Plugin.combine(physicsData, model, shapeGeometry, interpolation), - archetypes: { - Prop: ["geometry", "position", "rotation", "scale", "visible", "material"], - }, + extends: Database.Plugin.combine(physicsData, mesh, shapeGeometry, interpolation), systems: { physicsBridge: { schedule: { during: ["postUpdate"] }, create: db => { - // Sphere/cube are unit meshes scaled by half-extents. A capsule can't - // be non-uniformly scaled (its caps would distort), so it's built at its - // real size and drawn at unit scale — one mesh per distinct (radius, - // half-height), cached here (scenes use very few capsule sizes). - const capsuleGeometry = new Map(); + const capsuleMeshes = new Map(); const ensureCapsule = (device: GPUDevice, r: number, hy: number): Entity => { const key = `${r}:${hy}`; - let geo = capsuleGeometry.get(key); - if (geo === undefined) { - const m = uploadShapeMesh(device, capsuleMesh(r, hy)); - geo = db.transactions.insertShapePrimitive({ vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count }); - capsuleGeometry.set(key, geo); + let id = capsuleMeshes.get(key); + if (id === undefined) { + const data = capsuleMesh(r, hy); + const m = uploadShapeMesh(device, data); + id = db.transactions.insertStaticMeshPrimitive({ + vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count, + localBounds: boundsFromShapeMesh(data), + }); + capsuleMeshes.set(key, id); } - return geo; + return id; }; - // Hull render mesh = triangulated convex hull of the point cloud, cached - // by the point-array reference (bodies sharing a cloud share one mesh + draw). - const hullGeometry = new Map(); + const hullMeshes = new Map(); const ensureHull = (device: GPUDevice, points: Float32Array): Entity => { - let geo = hullGeometry.get(points); - if (geo === undefined) { - const m = uploadShapeMesh(device, convexHullMesh(points)); - geo = db.transactions.insertShapePrimitive({ vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count }); - hullGeometry.set(points, geo); + let id = hullMeshes.get(points); + if (id === undefined) { + const data = convexHullMesh(points); + const m = uploadShapeMesh(device, data); + id = db.transactions.insertStaticMeshPrimitive({ + vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count, + localBounds: boundsFromShapeMesh(data), + }); + hullMeshes.set(points, id); } - return geo; + return id; }; - // Static-mesh render = flat-shaded triangle soup, cached by the colliderMesh ref. - const meshGeometry = new Map(); - const ensureMesh = (device: GPUDevice, cm: ColliderMesh): Entity => { - let geo = meshGeometry.get(cm); - if (geo === undefined) { - const m = uploadShapeMesh(device, flatShadedMesh(cm.positions, cm.indices)); - geo = db.transactions.insertShapePrimitive({ vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count }); - meshGeometry.set(cm, geo); + const triMeshes = new Map(); + const ensureTriMesh = (device: GPUDevice, cm: ColliderMesh): Entity => { + let id = triMeshes.get(cm); + if (id === undefined) { + const data = flatShadedMesh(cm.positions, cm.indices); + const m = uploadShapeMesh(device, data); + id = db.transactions.insertStaticMeshPrimitive({ + vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count, + localBounds: boundsFromShapeMesh(data), + }); + triMeshes.set(cm, id); } - return geo; + return id; }; return () => { - const shapes = db.store.resources._shapeGeometry; + const shapes = db.store.resources._shapeMeshes; const device = db.store.resources.device; if (!shapes || !device) return; - for (const arch of db.store.queryArchetypes(["colliderShape", "halfExtents"], { exclude: ["geometry"] })) { + for (const arch of db.store.queryArchetypes(["colliderShape", "halfExtents"], { exclude: ["mesh"] })) { const ids = arch.columns.id, css = arch.columns.colliderShape, hes = arch.columns.halfExtents; - // Tail→head: every visited body migrates out (gains geometry). for (let i = arch.rowCount - 1; i >= 0; i--) { const id = ids.get(i), shape = css.get(i), he = hes.get(i); - // capsule + hull render at unit scale (their meshes are real-size); - // sphere/cube are unit meshes scaled by half-extents. - let geometry: Entity, scale: [number, number, number]; - if (shape === "box") { geometry = shapes.cube; scale = [he[0], he[1], he[2]]; } - else if (shape === "capsule") { geometry = ensureCapsule(device, he[0], he[1]); scale = [1, 1, 1]; } + if ((db.store.read(id) as { voxelShape?: Entity }).voxelShape != null) continue; + let meshId: Entity, scale: [number, number, number]; + if (shape === "box") { meshId = shapes.cube; scale = [he[0], he[1], he[2]]; } + else if (shape === "capsule") { meshId = ensureCapsule(device, he[0], he[1]); scale = [1, 1, 1]; } else if (shape === "hull") { const pts = (db.store.read(id) as { convexPoints?: Float32Array | null }).convexPoints; - geometry = pts ? ensureHull(device, pts) : shapes.sphere; + meshId = pts ? ensureHull(device, pts) : shapes.sphere; scale = [1, 1, 1]; } else if (shape === "mesh") { const cm = (db.store.read(id) as { colliderMesh?: ColliderMesh | null }).colliderMesh; - geometry = cm ? ensureMesh(device, cm) : shapes.cube; + meshId = cm ? ensureTriMesh(device, cm) : shapes.cube; scale = [1, 1, 1]; - } else { geometry = shapes.sphere; scale = [he[0], he[0], he[0]]; } - db.store.update(id, { geometry, scale, visible: true }); + } else { meshId = shapes.sphere; scale = [he[0], he[0], he[0]]; } + db.store.update(id, { mesh: meshId, scale, visible: true }); } } }; diff --git a/packages/data-gpu/src/graphics/rendering/pbr-render/primitive-render-shared.ts b/packages/data-gpu/src/graphics/rendering/pbr-render/primitive-render-shared.ts new file mode 100644 index 00000000..aeaa6fa0 --- /dev/null +++ b/packages/data-gpu/src/graphics/rendering/pbr-render/primitive-render-shared.ts @@ -0,0 +1,76 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { Entity } from "@adobe/data/ecs"; + +/** Must match `pbrIblRender` IBL bake mip count. */ +export const PREFILTERED_MIP_COUNT = 7; + +/** Drawable: visible entity with mesh ref, transform, and material. */ +export const DRAWABLE = ["mesh", "visible", "position", "rotation", "scale", "material"] as const; +export const DRAWABLE_INTERP = [...DRAWABLE, "_renderPosition", "_renderRotation"] as const; +export const DRAWABLE_DIRECT = { exclude: ["_renderPosition"] } as const; +export const PRIMITIVE = ["_vertexBuffer", "_indexBuffer", "_indexCount", "_indexFormat", "_mesh", "_nodeLocalMatrix"] as const; + +/** Minimal column shape the gather reads — satisfied by either query's columns. */ +export interface ColumnReader { get(i: number): T } + +export function createIblBindGroupLayout(device: GPUDevice): GPUBindGroupLayout { + return device.createBindGroupLayout({ + entries: [ + { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } }, + { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } }, + { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } }, + { binding: 3, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } }, + ], + }); +} + +/** Compose column-major TRS into `out[o..o+15]`. */ +export function composeTrs( + out: Float32Array, o: number, + p: ArrayLike, pi: number, q: ArrayLike, qi: number, s: ArrayLike, si: number, +): void { + const qx = q[qi], qy = q[qi + 1], qz = q[qi + 2], qw = q[qi + 3]; + const sx = s[si], sy = s[si + 1], sz = s[si + 2]; + const xx = qx * qx, yy = qy * qy, zz = qz * qz; + const xy = qx * qy, xz = qx * qz, yz = qy * qz; + const wx = qw * qx, wy = qw * qy, wz = qw * qz; + out[o] = (1 - 2 * (yy + zz)) * sx; out[o + 1] = (2 * (xy + wz)) * sx; out[o + 2] = (2 * (xz - wy)) * sx; out[o + 3] = 0; + out[o + 4] = (2 * (xy - wz)) * sy; out[o + 5] = (1 - 2 * (xx + zz)) * sy; out[o + 6] = (2 * (yz + wx)) * sy; out[o + 7] = 0; + out[o + 8] = (2 * (xz + wy)) * sz; out[o + 9] = (2 * (yz - wx)) * sz; out[o + 10] = (1 - 2 * (xx + yy)) * sz; out[o + 11] = 0; + out[o + 12] = p[pi]; out[o + 13] = p[pi + 1]; out[o + 14] = p[pi + 2]; out[o + 15] = 1; +} + +export interface MeshBatch { + off: number[]; + materialIndex: number[]; +} + +/** @deprecated Use `MeshBatch`. */ +export type GeometryBatch = MeshBatch; + +export interface InstancedDrawCache { + buffer: GPUBuffer; + indexBuffer: GPUBuffer; + bindGroup: GPUBindGroup; + capacity: number; +} + +/** Refresh material entity → GPU index map when the tagged material set grows. */ +export function refreshMaterialIndexMap( + db: { store: { queryArchetypes: (cols: string[]) => Iterable<{ rowCount: number; columns: { id: ColumnReader; [k: string]: ColumnReader } }> } }, + indexColumn: string, + matCount: { value: number }, + matIndex: Map, +): void { + let mc = 0; + for (const arch of db.store.queryArchetypes([indexColumn])) mc += arch.rowCount; + if (mc === matCount.value) return; + matIndex.clear(); + for (const arch of db.store.queryArchetypes([indexColumn])) { + const id = arch.columns.id; + const col = arch.columns[indexColumn]; + for (let i = 0; i < arch.rowCount; i++) matIndex.set(id.get(i), col.get(i)); + } + matCount.value = mc; +} diff --git a/packages/data-gpu/src/graphics/rendering/skinning/skinning-plugin.ts b/packages/data-gpu/src/graphics/rendering/skinning/skinning-plugin.ts index 36c15431..f75e04b7 100644 --- a/packages/data-gpu/src/graphics/rendering/skinning/skinning-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/skinning/skinning-plugin.ts @@ -9,36 +9,21 @@ import { animation } from "../../animation/animation-plugin.js"; import type { JointTemplate } from "../../scene/model/gltf/parse-skin.js"; /** - * pbrSkinning - * query: Model+geometry, _Skeleton - * read: - * geometry - * _skinJointTemplate (from Geometry) - * _skinInverseBindMatrices (from Geometry) - * _animationClipRefs (from Geometry) - * _worldMatrix (from Model + joint Nodes) - * write: - * _Skeleton // new ephemeral entity, one per skinned Model - * Node // joint entities (TRS hierarchy) - * Animation // optional, when geometry has clips - * _skeletonInstanceBuffer - * _skeletonJointMatrixBuffer - * _skeletonJointMatrixBindGroup + * pbrSkinning — builds a `_Skeleton` for each `Model` whose `mesh` is a + * `SkinnedMesh` (non-empty `skinJointTemplate`). */ export const pbrSkinning = Database.Plugin.create({ extends: Database.Plugin.combine(modelLoader, pbrCore, transform, animation), components: { _skeletonJoints: { default: [] as number[] }, - _skeletonGeometry: Entity.schema, - /** 64 bytes — the Model's world matrix, refreshed each frame. */ + _skeletonMesh: Entity.schema, _skeletonInstanceBuffer: { default: null as GPUBuffer | null }, - /** N × 64 bytes — joint skinning matrices, refreshed each frame. */ _skeletonJointMatrixBuffer: { default: null as GPUBuffer | null }, }, archetypes: { _Skeleton: [ "_skeletonJoints", - "_skeletonGeometry", + "_skeletonMesh", "_skeletonModelRef", "_skeletonInstanceBuffer", "_skeletonJointMatrixBuffer", @@ -48,7 +33,7 @@ export const pbrSkinning = Database.Plugin.create({ transactions: { initSkeleton(t, args: { modelRef: number; - geometryRef: number; + meshRef: number; jointTemplate: readonly JointTemplate[]; instanceBuffer: GPUBuffer; jointMatrixBuffer: GPUBuffer; @@ -56,9 +41,6 @@ export const pbrSkinning = Database.Plugin.create({ clipRef: number | null; }) { const jointIds: number[] = new Array(args.jointTemplate.length); - // jointTemplate is in glTF skin.joints[] order. Parents can come - // after children in glTF, so resolve parent entity ids in two passes: - // first insert with parent=0, then update each joint's parent. for (let i = 0; i < args.jointTemplate.length; i++) { const j = args.jointTemplate[i]; jointIds[i] = t.archetypes.Node.insert({ @@ -76,7 +58,7 @@ export const pbrSkinning = Database.Plugin.create({ } t.archetypes._Skeleton.insert({ _skeletonJoints: jointIds, - _skeletonGeometry: args.geometryRef, + _skeletonMesh: args.meshRef, _skeletonModelRef: args.modelRef, _skeletonInstanceBuffer: args.instanceBuffer, _skeletonJointMatrixBuffer: args.jointMatrixBuffer, @@ -110,15 +92,18 @@ export const pbrSkinning = Database.Plugin.create({ ], }); } - for (const arch of db.store.queryArchetypes(["geometry"])) { + for (const arch of db.store.queryArchetypes(["mesh"])) { const ids = arch.columns.id; - const geoRefs = arch.columns.geometry; + const meshRefs = arch.columns.mesh; for (let i = 0; i < arch.rowCount; i++) { const modelId = ids.get(i); if (initialized.has(modelId)) continue; - const geoId = geoRefs.get(i); - const geo = db.store.read(geoId); - const template = geo?._skinJointTemplate; + const meshId = meshRefs.get(i); + const asset = db.store.read(meshId) as { + skinJointTemplate?: JointTemplate[]; + animationClipRefs?: number[]; + } | null; + const template = asset?.skinJointTemplate; if (!template || template.length === 0) continue; initialized.add(modelId); @@ -139,12 +124,12 @@ export const pbrSkinning = Database.Plugin.create({ }); db.transactions.initSkeleton({ modelRef: modelId, - geometryRef: geoId, + meshRef: meshId, jointTemplate: template, instanceBuffer, jointMatrixBuffer: matrixBuffer, jointMatrixBindGroup: matrixBindGroup, - clipRef: geo?._animationClipRefs?.[0] ?? null, + clipRef: asset?.animationClipRefs?.[0] ?? null, }); } } @@ -160,29 +145,28 @@ export const pbrSkinning = Database.Plugin.create({ if (!device) return; for (const arch of db.store.queryArchetypes([ "_skeletonJoints", - "_skeletonGeometry", + "_skeletonMesh", "_skeletonModelRef", "_skeletonInstanceBuffer", "_skeletonJointMatrixBuffer", ])) { const jointsCol = arch.columns._skeletonJoints; - const geoCol = arch.columns._skeletonGeometry; + const meshCol = arch.columns._skeletonMesh; const modelCol = arch.columns._skeletonModelRef; const instBufCol = arch.columns._skeletonInstanceBuffer; const bufCol = arch.columns._skeletonJointMatrixBuffer; for (let i = 0; i < arch.rowCount; i++) { const joints = jointsCol.get(i); - const geoId = geoCol.get(i); + const meshId = meshCol.get(i); const modelId = modelCol.get(i); const instanceBuffer = instBufCol.get(i); const buffer = bufCol.get(i); if (!buffer || !instanceBuffer) continue; - const ibm = db.store.get(geoId, "_skinInverseBindMatrices"); + const ibm = db.store.get(meshId, "skinInverseBindMatrices") as Float32Array | null; if (!ibm) continue; const modelWorld = db.store.get(modelId, "_worldMatrix"); if (!modelWorld) continue; - // The vertex shader's `instances[0]` slot. device.queue.writeBuffer(instanceBuffer, 0, new Float32Array(modelWorld)); const invModelWorld = Mat4x4.inverse(modelWorld); @@ -191,8 +175,6 @@ export const pbrSkinning = Database.Plugin.create({ } for (let j = 0; j < joints.length; j++) { const jw = db.store.get(joints[j], "_worldMatrix") ?? Mat4x4.identity; - // inverse(modelWorld) × jointWorld × IBM — leaves vertices in - // model-local space; vertex shader applies modelWorld separately. const ibmJoint: Mat4x4 = [ ibm[j * 16 + 0], ibm[j * 16 + 1], ibm[j * 16 + 2], ibm[j * 16 + 3], ibm[j * 16 + 4], ibm[j * 16 + 5], ibm[j * 16 + 6], ibm[j * 16 + 7], diff --git a/packages/data-gpu/src/graphics/scene/model/geometry/geometry.ts b/packages/data-gpu/src/graphics/scene/model/geometry/geometry.ts deleted file mode 100644 index 2d51a68d..00000000 --- a/packages/data-gpu/src/graphics/scene/model/geometry/geometry.ts +++ /dev/null @@ -1,12 +0,0 @@ -// © 2026 Adobe. MIT License. See /LICENSE for details. - -/** - * One row of the `Geometry` archetype — an asset identified by URL. The - * model loader fetches the URL, then writes derived state (`_bounds`, - * primitive entities, animation clips) onto the same row. - */ -export interface Geometry { - modelUrl: string; -} - -export * as Geometry from "./public.js"; diff --git a/packages/data-gpu/src/graphics/scene/model/geometry/public.ts b/packages/data-gpu/src/graphics/scene/model/geometry/public.ts index 4aa281a4..67629287 100644 --- a/packages/data-gpu/src/graphics/scene/model/geometry/public.ts +++ b/packages/data-gpu/src/graphics/scene/model/geometry/public.ts @@ -1,4 +1,4 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. -// Reserved for future Geometry helpers (e.g. bounds queries). +/** @deprecated Use `mesh/mesh.ts`. */ export {}; diff --git a/packages/data-gpu/src/graphics/scene/model/mesh-plugin.ts b/packages/data-gpu/src/graphics/scene/model/mesh-plugin.ts new file mode 100644 index 00000000..95d50dd0 --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/mesh-plugin.ts @@ -0,0 +1,102 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import { Database, Entity } from "@adobe/data/ecs"; +import { Aabb, Quat, type Vec3 } from "@adobe/data/math"; +import { Node } from "../node/node.js"; +import { plugin as Material } from "../../../material/material-plugin.js"; +import type { ShapeSpec } from "./shape/shape-spec.js"; +import type { JointTemplate } from "./gltf/parse-skin.js"; + +/** + * Mesh asset model — separates mesh **intent** (pending import), **asset** + * (static or skinned capabilities), and **instance** (placed drawables). + * + * - `GltfMeshPending` / `ShapeMeshPending` — work queue; the entity id is the + * stable mesh handle instances can reference before GPU data exists. + * - `StaticMesh` / `SkinnedMesh` — baked assets with capability components. + * - `Model` — hierarchical instance (glTF / scene graph). + * - `MeshInstance` — render-only instance with a material (factor path). + */ +export const mesh = Database.Plugin.create({ + extends: Database.Plugin.combine(Node.plugin, Material), + components: { + /** Instance → baked mesh asset entity. */ + mesh: Entity.schema, + /** Pending glTF import — cleared when the row migrates to Static/SkinnedMesh. */ + gltfUrl: { type: "string" }, + /** Pending procedural import — cleared when baked to StaticMesh. */ + shapeSpec: { default: null as ShapeSpec | null }, + /** Voxel grid dimensions for baked voxelShape meshes (visual scale). */ + voxelVolumeSize: { default: null as Vec3 | null }, + /** Asset-space axis-aligned bounds (all baked meshes). */ + localBounds: { default: null as Aabb | null }, + /** Skinned-mesh capabilities (SkinnedMesh archetype). */ + skinJointTemplate: { default: [] as JointTemplate[] }, + skinInverseBindMatrices: { default: null as Float32Array | null }, + animationClipRefs: { default: [] as number[] }, + /** CPU-retained collision source for auto-collider generation. */ + cpuCollisionPositions: { default: null as Float32Array | null }, + cpuCollisionIndices: { default: null as Uint32Array | null }, + /** CPU-retained skin bind data for ragdoll capsule fitting. */ + cpuSkin: { default: null as { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null }, + }, + resources: { + _gltfMeshByUrl: { default: null as Map | null, transient: true }, + }, + archetypes: { + GltfMeshPending: ["gltfUrl"], + ShapeMeshPending: ["shapeSpec", "voxelVolumeSize"], + StaticMesh: ["localBounds"], + SkinnedMesh: ["localBounds", "skinJointTemplate", "skinInverseBindMatrices", "animationClipRefs"], + MeshInstance: ["mesh", "position", "rotation", "scale", "visible", "material"], + Model: ["mesh", "position", "rotation", "scale", "visible", "parent"], + }, + transactions: { + insertGltfMesh(t, args: { url: string }): Entity { + const map = t.resources._gltfMeshByUrl ??= new Map(); + const existing = map.get(args.url); + if (existing != null) return existing; + const id = t.archetypes.GltfMeshPending.insert({ gltfUrl: args.url }); + map.set(args.url, id); + return id; + }, + insertShapeMesh(t, args: { shapeSpec: ShapeSpec }): Entity { + return t.archetypes.ShapeMeshPending.insert({ shapeSpec: args.shapeSpec, voxelVolumeSize: null }); + }, + insertMeshInstance(t, args: { + mesh: Entity; + material: Entity; + position?: Vec3; + rotation?: Quat; + scale?: Vec3; + }): Entity { + return t.archetypes.MeshInstance.insert({ + mesh: args.mesh, + material: args.material, + position: args.position ?? [0, 0, 0], + rotation: args.rotation ?? Quat.identity, + scale: args.scale ?? [1, 1, 1], + visible: true, + }); + }, + insertModel(t, args: { + mesh: Entity; + position?: Vec3; + rotation?: Quat; + scale?: Vec3; + parent?: Entity; + }): Entity { + return t.archetypes.Model.insert({ + mesh: args.mesh, + position: args.position ?? [0, 0, 0], + rotation: args.rotation ?? Quat.identity, + scale: args.scale ?? [1, 1, 1], + visible: true, + parent: args.parent ?? 0, + }); + }, + }, +}); + +/** @deprecated Use `mesh` — kept for scene combiner import path. */ +export const model = mesh; diff --git a/packages/data-gpu/src/graphics/scene/model/mesh/mesh.ts b/packages/data-gpu/src/graphics/scene/model/mesh/mesh.ts new file mode 100644 index 00000000..ca0c6dc6 --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/mesh/mesh.ts @@ -0,0 +1,18 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { Aabb } from "@adobe/data/math"; +import type { JointTemplate } from "../gltf/parse-skin.js"; + +/** Baked static mesh asset — local-space bounds only. */ +export interface StaticMesh { + localBounds: Aabb; +} + +/** Baked skinned mesh asset — static capabilities plus skeleton/animation data. */ +export interface SkinnedMesh extends StaticMesh { + skinJointTemplate: JointTemplate[]; + skinInverseBindMatrices: Float32Array | null; + animationClipRefs: number[]; +} + +export * as Mesh from "./public.js"; diff --git a/packages/data-gpu/src/graphics/scene/model/mesh/public.ts b/packages/data-gpu/src/graphics/scene/model/mesh/public.ts new file mode 100644 index 00000000..0183e20b --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/mesh/public.ts @@ -0,0 +1,3 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +export { mesh as plugin } from "../mesh-plugin.js"; diff --git a/packages/data-gpu/src/graphics/scene/model/model-loader-plugin.ts b/packages/data-gpu/src/graphics/scene/model/model-loader-plugin.ts index b468d43d..1bdad465 100644 --- a/packages/data-gpu/src/graphics/scene/model/model-loader-plugin.ts +++ b/packages/data-gpu/src/graphics/scene/model/model-loader-plugin.ts @@ -5,13 +5,13 @@ import type { Aabb } from "@adobe/data/math"; import { pbrCore } from "../../rendering/pbr-core-plugin.js"; import { animation } from "../../animation/animation-plugin.js"; import { core } from "../../../core/core-plugin.js"; -import { Model } from "./model.js"; +import { mesh } from "./mesh-plugin.js"; import { loadGltfPrimitives, type GpuPrimitiveData } from "./gltf/load-gltf-model.js"; import type { LoadedAnimation } from "./gltf/parse-animations.js"; import type { JointTemplate } from "./gltf/parse-skin.js"; export interface LoadedArgs { - geometry: number; + mesh: number; bounds: Aabb; primitives: GpuPrimitiveData[]; skinJointTemplate: JointTemplate[]; @@ -22,44 +22,23 @@ export interface LoadedArgs { } /** - * modelLoader - * query: Geometry-_bounds - * read: - * modelUrl - * write: - * _bounds: Aabb - * _skinJointTemplate: JointTemplate[] - * _skinInverseBindMatrices: Float32Array | null - * _animationClipRefs: EntityId[] - * _VisibleMaterial - * _PbrPrimitive - * AnimationClip // when the glTF carries animations + * modelLoader — queries `GltfMeshPending`, fetches each `gltfUrl`, inserts + * `_PbrPrimitive` rows, and migrates the mesh entity to `StaticMesh` or + * `SkinnedMesh` with capability components. */ export const modelLoader = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrCore, Model.plugin, core, animation), - components: { - _bounds: { default: null as Aabb | null }, - _skinJointTemplate: { default: [] as JointTemplate[] }, - _skinInverseBindMatrices: { default: null as Float32Array | null }, - _animationClipRefs: { default: [] as number[] }, - // CPU-retained model-space collision geometry (auto-collider source). - _cpuPositions: { default: null as Float32Array | null }, - _cpuIndices: { default: null as Uint32Array | null }, - // CPU-retained skin (mesh-bind positions + 4 joints + 4 weights per vertex), - // for fitting per-bone ragdoll capsules. - _cpuSkin: { default: null as { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null }, - }, + extends: Database.Plugin.combine(pbrCore, mesh, core, animation), transactions: { insertLoadedPrimitives(t, args: LoadedArgs) { for (const p of args.primitives) { const materialId = t.archetypes._VisibleMaterial.insert({ ephemeral: true, _materialBindGroup: p.pbrMaterialBindGroup, - _geometry: args.geometry, + _mesh: args.mesh, }); t.archetypes._PbrPrimitive.insert({ ephemeral: true, - _geometry: args.geometry, + _mesh: args.mesh, _material: materialId, _vertexBuffer: p.pbrVertexBuffer, _skinVertexBuffer: p.pbrSkinVertexBuffer, @@ -78,14 +57,17 @@ export const modelLoader = Database.Plugin.create({ }); clipRefs.push(clipId); } - t.update(args.geometry, { - _bounds: args.bounds, - _skinJointTemplate: args.skinJointTemplate, - _skinInverseBindMatrices: args.skinInverseBindMatrices, - _animationClipRefs: clipRefs, - _cpuPositions: args.collision?.positions ?? null, - _cpuIndices: args.collision?.indices ?? null, - _cpuSkin: args.skinVertices, + const skinned = args.skinJointTemplate.length > 0; + t.update(args.mesh, { + localBounds: args.bounds, + cpuCollisionPositions: args.collision?.positions ?? null, + cpuCollisionIndices: args.collision?.indices ?? null, + cpuSkin: args.skinVertices, + ...(skinned ? { + skinJointTemplate: args.skinJointTemplate, + skinInverseBindMatrices: args.skinInverseBindMatrices, + animationClipRefs: clipRefs, + } : {}), }); }, }, @@ -96,19 +78,19 @@ export const modelLoader = Database.Plugin.create({ return () => { const { device } = db.store.resources; if (!device) return; - for (const arch of db.store.queryArchetypes(["modelUrl"])) { + for (const arch of db.store.queryArchetypes(["gltfUrl"])) { const ids = arch.columns.id; - const urls = arch.columns.modelUrl; + const urls = arch.columns.gltfUrl; for (let i = 0; i < arch.rowCount; i++) { const id = ids.get(i); if (inFlight.has(id)) continue; const url = urls.get(i); - if (!url) continue; // procedural geometries (shapes) carry no URL + if (!url) continue; inFlight.add(id); loadGltfPrimitives(device, url) .then(loaded => { db.transactions.insertLoadedPrimitives({ - geometry: id, + mesh: id, bounds: loaded.bounds, primitives: loaded.primitives, skinJointTemplate: loaded.skin?.jointTemplate ?? [], diff --git a/packages/data-gpu/src/graphics/scene/model/model-plugin.ts b/packages/data-gpu/src/graphics/scene/model/model-plugin.ts index 30bbfcbf..0cca71af 100644 --- a/packages/data-gpu/src/graphics/scene/model/model-plugin.ts +++ b/packages/data-gpu/src/graphics/scene/model/model-plugin.ts @@ -1,46 +1,3 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. -import { Database, Entity } from "@adobe/data/ecs"; -import { Quat, type Vec3 } from "@adobe/data/math"; -import { Node } from "../node/node.js"; - -/** - * Authored renderable scene. A `Geometry` is an asset identified by URL; a - * `Model` is a placed instance of a Geometry — a Node plus a reference to - * the Geometry it draws. - * - * Loading is performed by `modelLoader`, which reads the `modelUrl` and - * produces the GPU primitives the renderers consume. - */ -export const model = Database.Plugin.create({ - extends: Node.plugin, - components: { - modelUrl: { type: "string" }, - geometry: Entity.schema, - }, - archetypes: { - Geometry: ["modelUrl"], - Model: ["geometry", "position", "rotation", "scale", "visible", "parent"], - }, - transactions: { - insertGeometry(t, args: { modelUrl: string }): number { - return t.archetypes.Geometry.insert({ modelUrl: args.modelUrl }); - }, - insertModel(t, args: { - geometry: number; - position?: Vec3; - rotation?: Quat; - scale?: Vec3; - parent?: number; - }): number { - return t.archetypes.Model.insert({ - geometry: args.geometry, - position: args.position ?? [0, 0, 0], - rotation: args.rotation ?? Quat.identity, - scale: args.scale ?? [1, 1, 1], - visible: true, - parent: args.parent ?? 0, - }); - }, - }, -}); +export { mesh as model } from "./mesh-plugin.js"; diff --git a/packages/data-gpu/src/graphics/scene/model/model.ts b/packages/data-gpu/src/graphics/scene/model/model.ts index 96525a5d..5e0746da 100644 --- a/packages/data-gpu/src/graphics/scene/model/model.ts +++ b/packages/data-gpu/src/graphics/scene/model/model.ts @@ -3,13 +3,9 @@ import type { Entity } from "@adobe/data/ecs"; import type { Node } from "../node/node.js"; -/** - * One row of the `Model` archetype — a placed instance of a Geometry. A - * Node (transform + visibility + parent) plus a reference to the Geometry - * the renderer should draw. - */ +/** One row of the `Model` archetype — a placed instance of a mesh asset. */ export interface Model extends Node { - geometry: Entity; + mesh: Entity; } export * as Model from "./public.js"; diff --git a/packages/data-gpu/src/graphics/scene/model/public.ts b/packages/data-gpu/src/graphics/scene/model/public.ts index 71684ded..c642b21b 100644 --- a/packages/data-gpu/src/graphics/scene/model/public.ts +++ b/packages/data-gpu/src/graphics/scene/model/public.ts @@ -1 +1,3 @@ -export { model as plugin } from "./model-plugin.js"; +// © 2026 Adobe. MIT License. See /LICENSE for details. + +export { mesh as plugin } from "./mesh-plugin.js"; diff --git a/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts b/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts new file mode 100644 index 00000000..240ef8a1 --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts @@ -0,0 +1,42 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. +import { describe, it, expect } from "vitest"; +import { createTypedBuffer } from "@adobe/data/typed-buffer"; +import { Boolean } from "@adobe/data/schema"; +import { DenseVolume } from "@adobe/data/volume"; +import { booleanVolumeMesh } from "./boolean-volume-mesh.js"; +import { definitions } from "../../../../voxel-shape/voxel-shape-definitions.js"; +import { volumeContentKey } from "../../../../voxel-shape/volume-content-key.js"; + +describe("booleanVolumeMesh", () => { + it("should emit no geometry for an empty volume", () => { + const volume = definitions.hollowFrame(); + const mesh = booleanVolumeMesh(volume); + expect(mesh.vertices.length).toBeGreaterThan(0); + expect(mesh.indices.length).toBeGreaterThan(0); + }); + + it("should produce identical keys for equivalent volumes", () => { + const a = definitions.stairStep(); + const b = definitions.stairStep(); + expect(volumeContentKey(a)).toBe(volumeContentKey(b)); + }); + + it("should differ between shape definitions", () => { + expect(volumeContentKey(definitions.stairStep())).not.toBe(volumeContentKey(definitions.lCorner())); + }); + + it("should cull internal faces on a solid cube", () => { + const volume = definitions.solidCube(); + const mesh = booleanVolumeMesh(volume); + // 4x4x4 solid → 6 * 16 = 96 outer faces → 96 * 6 = 576 verts (2 tris × 3 verts) + expect(mesh.indices.length).toBe(96 * 6); + }); + + it("should handle a single-voxel volume", () => { + const data = createTypedBuffer(Boolean.schema, 1); + data.set(0, true); + const volume = DenseVolume.create({ size: [1, 1, 1], data }); + const mesh = booleanVolumeMesh(volume); + expect(mesh.indices.length).toBe(36); + }); +}); diff --git a/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.ts b/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.ts new file mode 100644 index 00000000..727720bb --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.ts @@ -0,0 +1,150 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { DenseVolume } from "@adobe/data/volume"; +import type { Vec3 } from "@adobe/data/math"; +import { DenseVolume as DenseVolumeOps } from "@adobe/data/volume"; +import type { ShapeMesh } from "./shape-mesh.js"; + +const DIRECTIONS: readonly Vec3[] = [ + [1, 0, 0], [-1, 0, 0], + [0, 1, 0], [0, -1, 0], + [0, 0, 1], [0, 0, -1], +] as const; + +const FACE_QUADS: readonly number[][] = [ + [2, 6, 5, 1], + [4, 7, 3, 0], + [3, 7, 6, 2], + [1, 5, 4, 0], + [5, 6, 7, 4], + [3, 2, 1, 0], +]; + +function pushVertex( + out: number[], + px: number, py: number, pz: number, + nx: number, ny: number, nz: number, +): void { + const tx = ny === 0 && nz !== 0 ? 1 : 0; + const ty = 0; + const tz = nx !== 0 ? 0 : 1; + out.push(px, py, pz, nx, ny, nz, tx, ty, tz, 1, 0, 0); +} + +function setVertexPosition( + out: number[], + x: number, y: number, z: number, + vertexIndex: number, + x1: number, y1: number, z1: number, + cx: number, cy: number, cz: number, +): void { + let px: number, py: number, pz: number; + switch (vertexIndex) { + case 0: px = x; py = y; pz = z; break; + case 1: px = x1; py = y; pz = z; break; + case 2: px = x1; py = y1; pz = z; break; + case 3: px = x; py = y1; pz = z; break; + case 4: px = x; py = y; pz = z1; break; + case 5: px = x1; py = y; pz = z1; break; + case 6: px = x1; py = y1; pz = z1; break; + case 7: px = x; py = y1; pz = z1; break; + default: px = x; py = y; pz = z; break; + } + pushVertex(out, px - cx, py - cy, pz - cz, 0, 0, 0); +} + +function getNormalIndex(dx: number, dy: number, dz: number): number { + if (dx === 1) return 0; + if (dx === -1) return 1; + if (dy === 1) return 2; + if (dy === -1) return 3; + if (dz === 1) return 4; + if (dz === -1) return 5; + return 0; +} + +const isSolid = (volume: DenseVolume, x: number, y: number, z: number): boolean => + DenseVolumeOps.get(volume, x, y, z) === true; + +/** Face-culled unit-voxel mesh from a boolean dense volume, centered at the origin. */ +export const booleanVolumeMesh = (volume: DenseVolume): ShapeMesh => { + const [width, height, depth] = volume.size; + const cx = width * 0.5; + const cy = height * 0.5; + const cz = depth * 0.5; + + const faces: number[] = []; + let faceCount = 0; + + for (let z = 0; z < depth; z++) { + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + if (!isSolid(volume, x, y, z)) continue; + + for (const [dx, dy, dz] of DIRECTIONS) { + const nx = x + dx; + const ny = y + dy; + const nz = z + dz; + const boundary = nx < 0 || nx >= width || ny < 0 || ny >= height || nz < 0 || nz >= depth; + if (!boundary && isSolid(volume, nx, ny, nz)) continue; + + const offset = faceCount * 6; + faces[offset + 0] = x; + faces[offset + 1] = y; + faces[offset + 2] = z; + faces[offset + 3] = dx; + faces[offset + 4] = dy; + faces[offset + 5] = dz; + faceCount++; + } + } + } + } + + const verts: number[] = []; + const indices: number[] = []; + + for (let i = 0; i < faceCount; i++) { + const offset = i * 6; + const x = faces[offset + 0]!; + const y = faces[offset + 1]!; + const z = faces[offset + 2]!; + const dx = faces[offset + 3]!; + const dy = faces[offset + 4]!; + const dz = faces[offset + 5]!; + const nx = dx; + const ny = dy; + const nz = dz; + + const x1 = x + 1; + const y1 = y + 1; + const z1 = z + 1; + const quad = FACE_QUADS[getNormalIndex(dx, dy, dz)]!; + + const patchNormal = (base: number): void => { + verts[base + 3] = nx; + verts[base + 4] = ny; + verts[base + 5] = nz; + }; + + const base = verts.length / 12; + setVertexPosition(verts, x, y, z, quad[0]!, x1, y1, z1, cx, cy, cz); + patchNormal(verts.length - 12); + setVertexPosition(verts, x, y, z, quad[1]!, x1, y1, z1, cx, cy, cz); + patchNormal(verts.length - 12); + setVertexPosition(verts, x, y, z, quad[2]!, x1, y1, z1, cx, cy, cz); + patchNormal(verts.length - 12); + indices.push(base, base + 1, base + 2); + + const base2 = verts.length / 12; + setVertexPosition(verts, x, y, z, quad[0]!, x1, y1, z1, cx, cy, cz); + patchNormal(verts.length - 12); + setVertexPosition(verts, x, y, z, quad[2]!, x1, y1, z1, cx, cy, cz); + patchNormal(verts.length - 12); + setVertexPosition(verts, x, y, z, quad[3]!, x1, y1, z1, cx, cy, cz); + patchNormal(verts.length - 12); + indices.push(base2, base2 + 1, base2 + 2); + } + + return { vertices: new Float32Array(verts), indices: new Uint16Array(indices) }; +}; diff --git a/packages/data-gpu/src/graphics/scene/model/shape/bounds-from-shape-mesh.ts b/packages/data-gpu/src/graphics/scene/model/shape/bounds-from-shape-mesh.ts new file mode 100644 index 00000000..dbebc887 --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/shape/bounds-from-shape-mesh.ts @@ -0,0 +1,20 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { Aabb } from "@adobe/data/math"; +import type { ShapeMesh } from "./shape-mesh.js"; + +const FLOATS_PER_VERTEX = 12; + +/** Axis-aligned bounds of packed StandardVertex positions in a shape mesh. */ +export const boundsFromShapeMesh = (mesh: ShapeMesh): Aabb => { + const v = mesh.vertices; + let minX = Infinity, minY = Infinity, minZ = Infinity; + let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity; + for (let i = 0; i < v.length; i += FLOATS_PER_VERTEX) { + const x = v[i], y = v[i + 1], z = v[i + 2]; + if (x < minX) minX = x; if (x > maxX) maxX = x; + if (y < minY) minY = y; if (y > maxY) maxY = y; + if (z < minZ) minZ = z; if (z > maxZ) maxZ = z; + } + return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] }; +}; diff --git a/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts b/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts index 48da30e8..2489cd3c 100644 --- a/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts +++ b/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts @@ -1,33 +1,46 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. import { Database, type Entity } from "@adobe/data/ecs"; +import type { Aabb } from "@adobe/data/math"; import { Mat4x4 } from "@adobe/data/math"; import { pbrCore } from "../../../rendering/pbr-core-plugin.js"; import { core } from "../../../../core/core-plugin.js"; -import { model } from "../model-plugin.js"; +import { mesh } from "../mesh-plugin.js"; import { unitSphere, unitCube } from "./shape-mesh.js"; import { uploadShapeMesh } from "./upload-shape-mesh.js"; +import { boundsFromShapeMesh } from "./bounds-from-shape-mesh.js"; +import { capsuleMesh, flatShadedMesh } from "./shape-mesh.js"; +import { convexHullMesh } from "./convex-hull.js"; +import { booleanVolumeMesh } from "./boolean-volume-mesh.js"; +import type { ShapeSpec } from "./shape-spec.js"; /** - * shapeGeometry — registers procedural unit-sphere and unit-cube geometries as - * `Geometry` + `_PbrPrimitive` entities (StandardVertex layout), exactly like - * the model loader does for glTF, so primitives and loaded models share one - * render path. The two geometry entity ids are published in `_shapeGeometry` - * for the physics render bridge to reference (sphere / cuboid bodies). Built - * once when the device is ready. + * shapeGeometry — bakes procedural meshes into `StaticMesh` + `_PbrPrimitive` + * (StandardVertex layout). Registers shared unit sphere/cube at init; provides + * `insertStaticMeshPrimitive` for direct bakes (capsule/hull caches, etc.). */ export const shapeGeometry = Database.Plugin.create({ - extends: Database.Plugin.combine(pbrCore, model, core), + extends: Database.Plugin.combine(pbrCore, mesh, core), resources: { - _shapeGeometry: { default: null as { sphere: Entity; cube: Entity } | null, transient: true }, + _shapeMeshes: { default: null as { sphere: Entity; cube: Entity } | null, transient: true }, + _voxelVolumeByMesh: { default: null as Map> | null, transient: true }, }, transactions: { - insertShapePrimitive(t, args: { vertexBuffer: GPUBuffer; indexBuffer: GPUBuffer; indexCount: number }): Entity { - const geometry = t.archetypes.Geometry.insert({ modelUrl: "" }); + insertStaticMeshPrimitive(t, args: { + mesh?: Entity; + vertexBuffer: GPUBuffer; + indexBuffer: GPUBuffer; + indexCount: number; + localBounds: Aabb; + }): Entity { + const meshId = args.mesh ?? t.archetypes.StaticMesh.insert({ localBounds: args.localBounds }); + if (args.mesh !== undefined) { + t.update(args.mesh, { localBounds: args.localBounds }); + } t.archetypes._PbrPrimitive.insert({ ephemeral: true, - _geometry: geometry, - _material: 0, // primitives carry material per-instance, not here + _mesh: meshId, + _material: 0, _vertexBuffer: args.vertexBuffer, _skinVertexBuffer: null, _indexBuffer: args.indexBuffer, @@ -35,7 +48,7 @@ export const shapeGeometry = Database.Plugin.create({ _indexFormat: "uint16", _nodeLocalMatrix: Mat4x4.identity, }); - return geometry; + return meshId; }, }, systems: { @@ -50,12 +63,92 @@ export const shapeGeometry = Database.Plugin.create({ const s = uploadShapeMesh(device, unitSphere()); const c = uploadShapeMesh(device, unitCube()); - const sphere = db.transactions.insertShapePrimitive({ vertexBuffer: s.vb, indexBuffer: s.ib, indexCount: s.count }); - const cube = db.transactions.insertShapePrimitive({ vertexBuffer: c.vb, indexBuffer: c.ib, indexCount: c.count }); - db.store.resources._shapeGeometry = { sphere, cube }; + const sphere = db.transactions.insertStaticMeshPrimitive({ + vertexBuffer: s.vb, indexBuffer: s.ib, indexCount: s.count, + localBounds: boundsFromShapeMesh(unitSphere()), + }); + const cube = db.transactions.insertStaticMeshPrimitive({ + vertexBuffer: c.vb, indexBuffer: c.ib, indexCount: c.count, + localBounds: boundsFromShapeMesh(unitCube()), + }); + db.store.resources._shapeMeshes = { sphere, cube }; done = true; }; }, }, + shapeMeshBake: { + schedule: { during: ["preUpdate"], after: ["shapeGeometryInit"] }, + create: db => { + const bake = (spec: ShapeSpec, meshId: number): { + vb: GPUBuffer; + ib: GPUBuffer; + count: number; + localBounds: Aabb; + voxelVolumeSize?: readonly [number, number, number]; + } | null => { + const { device } = db.store.resources; + if (!device) return null; + if (spec.kind === "unitSphere") { + const data = unitSphere(); + const gpu = uploadShapeMesh(device, data); + return { ...gpu, localBounds: boundsFromShapeMesh(data) }; + } + if (spec.kind === "unitBox") { + const data = unitCube(); + const gpu = uploadShapeMesh(device, data); + return { ...gpu, localBounds: boundsFromShapeMesh(data) }; + } + if (spec.kind === "capsule") { + const data = capsuleMesh(spec.radius, spec.halfHeight); + const gpu = uploadShapeMesh(device, data); + return { ...gpu, localBounds: boundsFromShapeMesh(data) }; + } + if (spec.kind === "convexHull") { + const data = convexHullMesh(spec.points); + const gpu = uploadShapeMesh(device, data); + return { ...gpu, localBounds: boundsFromShapeMesh(data) }; + } + if (spec.kind === "triMesh") { + const data = flatShadedMesh(spec.positions, spec.indices); + const gpu = uploadShapeMesh(device, data); + return { ...gpu, localBounds: boundsFromShapeMesh(data) }; + } + if (spec.kind === "voxelShape") { + const volume = db.store.resources._voxelVolumeByMesh?.get(meshId) ?? null; + if (!volume) return null; + const data = booleanVolumeMesh(volume); + const gpu = uploadShapeMesh(device, data); + return { ...gpu, localBounds: boundsFromShapeMesh(data), voxelVolumeSize: volume.size }; + } + return null; + }; + return () => { + for (const arch of db.store.queryArchetypes(["shapeSpec"])) { + const ids = arch.columns.id; + const specs = arch.columns.shapeSpec; + for (let i = arch.rowCount - 1; i >= 0; i--) { + const spec = specs.get(i); + if (!spec) continue; + const meshId = ids.get(i); + const baked = bake(spec, meshId); + if (!baked) continue; + db.transactions.insertStaticMeshPrimitive({ + mesh: meshId, + vertexBuffer: baked.vb, + indexBuffer: baked.ib, + indexCount: baked.count, + localBounds: baked.localBounds, + }); + db.store.update(meshId, { + shapeSpec: null, + ...(baked.voxelVolumeSize != null + ? { voxelVolumeSize: [...baked.voxelVolumeSize] as [number, number, number] } + : {}), + }); + } + } + }; + }, + }, }, }); diff --git a/packages/data-gpu/src/graphics/scene/model/shape/shape-spec.ts b/packages/data-gpu/src/graphics/scene/model/shape/shape-spec.ts new file mode 100644 index 00000000..8b5c5fa6 --- /dev/null +++ b/packages/data-gpu/src/graphics/scene/model/shape/shape-spec.ts @@ -0,0 +1,10 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +/** Authored procedural mesh intent — consumed by the shape baker, not the renderer. */ +export type ShapeSpec = + | { kind: "unitSphere" } + | { kind: "unitBox" } + | { kind: "capsule"; radius: number; halfHeight: number } + | { kind: "convexHull"; points: Float32Array } + | { kind: "triMesh"; positions: Float32Array; indices: Uint32Array } + | { kind: "voxelShape" }; diff --git a/packages/data-gpu/src/graphics/scene/model/world-bounds-plugin.ts b/packages/data-gpu/src/graphics/scene/model/world-bounds-plugin.ts index bedc5900..247980a5 100644 --- a/packages/data-gpu/src/graphics/scene/model/world-bounds-plugin.ts +++ b/packages/data-gpu/src/graphics/scene/model/world-bounds-plugin.ts @@ -6,25 +6,8 @@ import { transform } from "../node/transform-plugin.js"; import { modelLoader } from "./model-loader-plugin.js"; /** - * worldBoundsCreate - * query: Model-_worldBounds - * write: _worldBounds (archetype migration; unit placeholder) - * - * Adds the `_worldBounds` column to any Model that doesn't have it yet, so - * `worldBoundsSystem` can write directly without further migration. - * - * worldBoundsSystem - * query: Model+_worldMatrix+_worldBounds - * read: geometry → _bounds, _worldMatrix - * write: _worldBounds - * - * Transforms the asset-space AABB on each Model's `geometry` by the Model's - * `_worldMatrix` (all 8 corners, reduce to min/max) and writes the result. - * Geometries still loading have no `_bounds` yet — those Models are skipped - * until the asset finishes; their `_worldBounds` stays at its placeholder. - * - * Cost: one matrix-vec multiply × 8 corners × N visible Models, per frame. - * At N=1000 that's ~8K vec3 ops; well under 0.1ms on modern CPUs. + * worldBounds — derives `_worldBounds` on `Model` rows from each instance's + * mesh `localBounds` and `_worldMatrix`. */ export const worldBounds = Database.Plugin.create({ extends: Database.Plugin.combine(modelLoader, transform), @@ -33,11 +16,10 @@ export const worldBounds = Database.Plugin.create({ schedule: { after: ["transformCreateWorldMatrix"] }, create: db => () => { for (const arch of db.store.queryArchetypes( - ["geometry", "_worldMatrix"], + ["mesh", "_worldMatrix"], { exclude: ["_worldBounds"] }, )) { const ids = arch.columns.id; - // Iterate tail→head: every row migrates out of this archetype. for (let i = arch.rowCount - 1; i >= 0; i--) { db.store.update(ids.get(i), { _worldBounds: Aabb.unit }); } @@ -48,13 +30,13 @@ export const worldBounds = Database.Plugin.create({ schedule: { after: ["transformSystem", "worldBoundsCreate"] }, create: db => () => { for (const arch of db.store.queryArchetypes([ - "geometry", "_worldMatrix", "_worldBounds", + "mesh", "_worldMatrix", "_worldBounds", ])) { - const geos = arch.columns.geometry; + const meshRefs = arch.columns.mesh; const worldMats = arch.columns._worldMatrix; const worldBoundsCol = arch.columns._worldBounds; for (let i = 0; i < arch.rowCount; i++) { - const localBounds = db.store.get(geos.get(i), "_bounds"); + const localBounds = db.store.get(meshRefs.get(i), "localBounds") as Aabb | null; if (!localBounds) continue; worldBoundsCol.set(i, transformAabb(localBounds, worldMats.get(i))); } @@ -68,7 +50,6 @@ const transformAabb = (local: Aabb, m: Mat4x4): Aabb => { const { min, max } = local; let minX = Infinity, minY = Infinity, minZ = Infinity; let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity; - // The 8 box corners. for (let cx = 0; cx < 2; cx++) { for (let cy = 0; cy < 2; cy++) { for (let cz = 0; cz < 2; cz++) { diff --git a/packages/data-gpu/src/graphics/scene/scene-plugin.ts b/packages/data-gpu/src/graphics/scene/scene-plugin.ts index 5f8e0f58..9f1661e5 100644 --- a/packages/data-gpu/src/graphics/scene/scene-plugin.ts +++ b/packages/data-gpu/src/graphics/scene/scene-plugin.ts @@ -2,7 +2,7 @@ import { Database } from "@adobe/data/ecs"; import { plugin as nodePlugin } from "./node/node-plugin.js"; -import { model } from "./model/model-plugin.js"; +import { mesh } from "./model/mesh-plugin.js"; import { SceneUniforms } from "./scene-uniforms/scene-uniforms.js"; /** @@ -11,10 +11,10 @@ import { SceneUniforms } from "./scene-uniforms/scene-uniforms.js"; * * Combines: * - `Node.plugin` (node data + transform system) - * - `model` (Geometry + Model archetypes) + * - `mesh` (Mesh asset + Model/MeshInstance archetypes) * - `SceneUniforms.plugin` (camera resource + light resource + GPU uniform packing) * * Add a camera controller (e.g. `Orbit.plugin`), animation, and a renderer * (`pbrIblRender`) to get a working interactive scene. */ -export const scene = Database.Plugin.combine(nodePlugin, model, SceneUniforms.plugin); +export const scene = Database.Plugin.combine(nodePlugin, mesh, SceneUniforms.plugin); diff --git a/packages/data-gpu/src/index.ts b/packages/data-gpu/src/index.ts index 74b002f7..ec249018 100644 --- a/packages/data-gpu/src/index.ts +++ b/packages/data-gpu/src/index.ts @@ -31,6 +31,10 @@ export type { SolverBenchmarkOptions, SolverBenchmarkResult } from "./physics/so // --- Material registry (authored entities: physical + visible PBR props) ------ export { Material } from "./material/material.js"; +export { assembleMaterialRow } from "./material/assemble-material-row.js"; +export { requireMaterial } from "./material/require-material.js"; +export type { MaterialByNameLookup } from "./material/require-material.js"; +export { standardMaterialNames } from "./material/standard-materials.js"; // --- System plugins (consumed via aggregators) ------------------------------- export { transform } from "./graphics/scene/node/transform-plugin.js"; @@ -43,8 +47,8 @@ export type { PickHit } from "./graphics/picking/pick-hit.js"; // --- Rendering --------------------------------------------------------------- export { rendering } from "./graphics/rendering/rendering-plugin.js"; export { pbrIblRender } from "./graphics/rendering/ibl-render/ibl-render-plugin.js"; -export { materialGpu } from "./graphics/rendering/material-gpu/material-gpu-plugin.js"; -export { pbrRender } from "./graphics/rendering/pbr-render/pbr-render-plugin.js"; +export { materialPaletteGpu } from "./graphics/rendering/material-palette-gpu/material-palette-gpu-plugin.js"; +export { pbrFactorRender } from "./graphics/rendering/pbr-render/pbr-factor-render-plugin.js"; export { physicsRenderBridge } from "./graphics/rendering/pbr-render/physics-bridge-plugin.js"; export { displayTransform } from "./graphics/rendering/display-transform-plugin.js"; export { interpolation } from "./graphics/rendering/interpolation-plugin.js"; @@ -54,7 +58,13 @@ export { ragdollTrigger } from "./graphics/rendering/ragdoll-trigger-plugin.js"; export { joltRagdoll } from "./graphics/rendering/jolt-ragdoll-plugin.js"; export { fitBoneCapsules } from "./physics/ragdoll/fit-bone-capsules.js"; export type { BoneCapsule } from "./physics/ragdoll/fit-bone-capsules.js"; +export { mesh } from "./graphics/scene/model/mesh-plugin.js"; export { shapeGeometry } from "./graphics/scene/model/shape/shape-geometry-plugin.js"; +export type { ShapeSpec } from "./graphics/scene/model/shape/shape-spec.js"; +export { VoxelShape } from "./voxel-shape/voxel-shape.js"; +export { voxelShape, voxelShapeRender, voxelShapeVisualBridge } from "./voxel-shape/voxel-shape-plugin.js"; +export { requireVoxelShape } from "./voxel-shape/require-voxel-shape.js"; +export type { VoxelShapeByNameLookup } from "./voxel-shape/require-voxel-shape.js"; // --- Types (type + namespace, access .plugin for the ECS plugin) ------------- export { Camera } from "./graphics/camera/camera.js"; @@ -62,7 +72,7 @@ export { Light } from "./graphics/scene/light/light.js"; export { Orbit } from "./graphics/camera/orbit/orbit.js"; export { Node } from "./graphics/scene/node/node.js"; export { Model } from "./graphics/scene/model/model.js"; -export { Geometry } from "./graphics/scene/model/geometry/geometry.js"; +export { Mesh } from "./graphics/scene/model/mesh/mesh.js"; export { SceneUniforms } from "./graphics/scene/scene-uniforms/scene-uniforms.js"; export { StandardVertex } from "./graphics/rendering/standard-vertex/standard-vertex.js"; export { VisibleMaterial } from "./graphics/rendering/visible-material/visible-material.js"; diff --git a/packages/data-gpu/src/material/assemble-material-row.ts b/packages/data-gpu/src/material/assemble-material-row.ts new file mode 100644 index 00000000..f9516010 --- /dev/null +++ b/packages/data-gpu/src/material/assemble-material-row.ts @@ -0,0 +1,26 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { Material } from "./material.js"; +import type { MaterialDefinition } from "./material-definition.js"; +import { solidDefaults } from "./material-defaults.js"; + +/** Fields that `solidDefaults` does not supply — must appear on every definition or full row. */ +const REQUIRED_KEYS = [ + "density", + "restitution", + "heatCapacity", + "baseColorFactor", + "emissiveFactor", + "metallicFactor", + "roughnessFactor", +] as const satisfies readonly (keyof Material)[]; + +/** Merge defaults + definition into a full `Material` row; throw if required fields are missing. */ +export const assembleMaterialRow = (name: string, definition: MaterialDefinition): Material => { + const row = { name, ...solidDefaults, ...definition }; + const missing = REQUIRED_KEYS.filter(key => row[key] === undefined); + if (missing.length > 0) { + throw new Error(`Material "${name}" is missing required fields: ${missing.join(", ")}`); + } + return row as Material; +}; diff --git a/packages/data-gpu/src/material/definitions.ts b/packages/data-gpu/src/material/definitions.ts new file mode 100644 index 00000000..123fea36 --- /dev/null +++ b/packages/data-gpu/src/material/definitions.ts @@ -0,0 +1,427 @@ +import type { MaterialDefinition } from "./material-definition.js"; +import { StressStrainCurve } from "./stress-strain-curve/stress-strain-curve.js"; + +const defaultSolid = { + friction: 0.5, + compliance: 1e-8, + normalScale: 1, + occlusionStrength: 1, + baseColorUrl: "", + metallicRoughnessUrl: "", + normalUrl: "", + occlusionUrl: "", + emissiveUrl: "", +} as const satisfies Partial; + +const noSolidCurve = { + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0,0], + tensileFractureStrainStress: [0,0], + compressiveYieldStrainStress: [0,0], + compressiveFractureStrainStress: [0,0], + }), +}; + +const metaMaterialBase: Omit = { + metallicFactor: 0.8, + roughnessFactor: 0.2, + irReflectance: 0.5, + irEmission: 0, + emissionMode: 0, + restitution: 0.35, + emissiveFactor: [0, 0, 0], + density: 1200, + viscosity: 0, + heatCapacity: Number.POSITIVE_INFINITY, + thermalConductivity: 100, + ...defaultSolid, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.01333, 40], + tensileFractureStrainStress: [0.08, 48], + compressiveYieldStrainStress: [-0.015, -45], + compressiveFractureStrainStress: [-0.09, -52], + }), +}; + +export const definitions = { + air: { + baseColorFactor: [1,1,1,0], + metallicFactor: 0, + roughnessFactor: 0, + irReflectance: 0, + irEmission: 0, + emissionMode: 0, + restitution: 0, + emissiveFactor: [0,0,0], + density: 1.225, + viscosity: 0, + heatCapacity: 1006, + thermalConductivity: 0.024, + ...defaultSolid, + ...noSolidCurve, + }, + water: { + baseColorFactor: [0,0,1,0.1], + metallicFactor: 0, + roughnessFactor: 0, + irReflectance: 0, + irEmission: 0, + emissionMode: 0, + restitution: 0.05, + emissiveFactor: [0,0,0], + density: 997, + viscosity: 1, + heatCapacity: 4200, + thermalConductivity: 0.66, + ...defaultSolid, + ...noSolidCurve, + }, + rock: { + baseColorFactor: [0.5,0.5,0.5,1], + metallicFactor: 0, + roughnessFactor: 0.8, + irReflectance: 0.1, + irEmission: 0, + emissionMode: 0, + restitution: 0.15, + emissiveFactor: [0,0,0], + density: 2650, + viscosity: 0, + heatCapacity: 800, + thermalConductivity: 4, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.0016,80], + tensileFractureStrainStress: [0.002,90], + compressiveYieldStrainStress: [-0.0026,-130], + compressiveFractureStrainStress: [-0.004,-160], + }), + }, + ice: { + baseColorFactor: [0.8,0.8,1,0.5], + metallicFactor: 0, + roughnessFactor: 0.1, + irReflectance: 0.2, + irEmission: 0, + emissionMode: 0, + restitution: 0.2, + emissiveFactor: [0,0,0], + density: 917, + viscosity: 0, + heatCapacity: 2040, + thermalConductivity: 2.18, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00156,15], + tensileFractureStrainStress: [0.002,18], + compressiveYieldStrainStress: [-0.00365,-35], + compressiveFractureStrainStress: [-0.005,-45], + }), + }, + iron: { + baseColorFactor: [0.7,0.7,0.7,1], + metallicFactor: 1, + roughnessFactor: 0.3, + irReflectance: 0.4, + irEmission: 0, + emissionMode: 0, + restitution: 0.45, + emissiveFactor: [0,0,0], + density: 7874, + viscosity: 0, + heatCapacity: 460, + thermalConductivity: 50, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.001,200], + tensileFractureStrainStress: [0.12,350], + compressiveYieldStrainStress: [-0.0011,-220], + compressiveFractureStrainStress: [-0.11,-400], + }), + }, + dirt: { + baseColorFactor: [0.4,0.3,0.2,1], + metallicFactor: 0, + roughnessFactor: 0.9, + irReflectance: 0.05, + irEmission: 0, + emissionMode: 0, + restitution: 0.05, + emissiveFactor: [0,0,0], + density: 1510, + viscosity: 0, + heatCapacity: 800, + thermalConductivity: 0.25, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.04,2], + tensileFractureStrainStress: [0.08,4], + compressiveYieldStrainStress: [-0.12,-6], + compressiveFractureStrainStress: [-0.2,-10], + }), + }, + sand: { + baseColorFactor: [0.9,0.8,0.6,1], + metallicFactor: 0, + roughnessFactor: 0.8, + irReflectance: 0.1, + irEmission: 0, + emissionMode: 0, + restitution: 0.15, + emissiveFactor: [0,0,0], + density: 2100, + viscosity: 0, + heatCapacity: 830, + thermalConductivity: 0.2, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.0125,1], + tensileFractureStrainStress: [0.025,2], + compressiveYieldStrainStress: [-0.05,-4], + compressiveFractureStrainStress: [-0.09,-7], + }), + }, + woodHard: { + baseColorFactor: [0.6,0.4,0.2,1], + metallicFactor: 0, + roughnessFactor: 0.7, + irReflectance: 0.05, + irEmission: 0, + emissionMode: 0, + restitution: 0.3, + emissiveFactor: [0,0,0], + density: 650, + viscosity: 0, + heatCapacity: 2000, + thermalConductivity: 0.16, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00375,45], + tensileFractureStrainStress: [0.04,52], + compressiveYieldStrainStress: [-0.0048,-58], + compressiveFractureStrainStress: [-0.055,-68], + }), + }, + woodSoft: { + baseColorFactor: [0.7,0.5,0.3,1], + metallicFactor: 0, + roughnessFactor: 0.8, + irReflectance: 0.05, + irEmission: 0, + emissionMode: 0, + restitution: 0.28, + emissiveFactor: [0,0,0], + density: 490, + viscosity: 0, + heatCapacity: 2300, + thermalConductivity: 0.12, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00389,35], + tensileFractureStrainStress: [0.045,42], + compressiveYieldStrainStress: [-0.00489,-44], + compressiveFractureStrainStress: [-0.055,-54], + }), + }, + steel: { + baseColorFactor: [0.55,0.55,0.6,1], + metallicFactor: 1, + roughnessFactor: 0.2, + irReflectance: 0.3, + irEmission: 0, + emissionMode: 0, + restitution: 0.55, + emissiveFactor: [0,0,0], + density: 7850, + viscosity: 0, + heatCapacity: 490, + thermalConductivity: 50, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00175,350], + tensileFractureStrainStress: [0.15,500], + compressiveYieldStrainStress: [-0.0019,-380], + compressiveFractureStrainStress: [-0.13,-520], + }), + }, + concrete: { + baseColorFactor: [0.6,0.6,0.6,1], + metallicFactor: 0, + roughnessFactor: 0.9, + irReflectance: 0.1, + irEmission: 0, + emissionMode: 0, + restitution: 0.12, + emissiveFactor: [0,0,0], + density: 2400, + viscosity: 0, + heatCapacity: 880, + thermalConductivity: 1.4, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.000117,3.5], + tensileFractureStrainStress: [0.00015,4], + compressiveYieldStrainStress: [-0.00117,-35], + compressiveFractureStrainStress: [-0.003,-40], + }), + }, + reinforcedConcrete: { + baseColorFactor: [0.55,0.55,0.55,1], + metallicFactor: 0.1, + roughnessFactor: 0.9, + irReflectance: 0.15, + irEmission: 0, + emissionMode: 0, + restitution: 0.14, + emissiveFactor: [0,0,0], + density: 2500, + viscosity: 0, + heatCapacity: 880, + thermalConductivity: 2, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00015,4.5], + tensileFractureStrainStress: [0.00022,5.5], + compressiveYieldStrainStress: [-0.0015,-45], + compressiveFractureStrainStress: [-0.0035,-55], + }), + }, + glass: { + baseColorFactor: [0.9,0.95,1,0.3], + metallicFactor: 0, + roughnessFactor: 0.05, + irReflectance: 0.1, + irEmission: 0, + emissionMode: 0, + restitution: 0.18, + emissiveFactor: [0,0,0], + density: 2500, + viscosity: 0, + heatCapacity: 840, + thermalConductivity: 1, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00043,30], + tensileFractureStrainStress: [0.0007,35], + compressiveYieldStrainStress: [-0.005,-350], + compressiveFractureStrainStress: [-0.006,-400], + }), + }, + temperedGlass: { + baseColorFactor: [0.5,0.55,0.6,0.4], + metallicFactor: 0, + roughnessFactor: 0.05, + irReflectance: 0.15, + irEmission: 0, + emissionMode: 0, + restitution: 0.22, + emissiveFactor: [0,0,0], + density: 2500, + viscosity: 0, + heatCapacity: 840, + thermalConductivity: 1, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00171,120], + tensileFractureStrainStress: [0.004,200], + compressiveYieldStrainStress: [-0.00786,-550], + compressiveFractureStrainStress: [-0.0095,-620], + }), + }, + meta: { + ...metaMaterialBase, + baseColorFactor: [0.2,0.6,0.7,1], + }, + marble: { + baseColorFactor: [0.9,0.9,0.9,1], + metallicFactor: 0, + roughnessFactor: 0.3, + irReflectance: 0.2, + irEmission: 0, + emissionMode: 0, + restitution: 0.12, + emissiveFactor: [0,0,0], + density: 2700, + viscosity: 0, + heatCapacity: 830, + thermalConductivity: 1.4, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.000455,25], + tensileFractureStrainStress: [0.00065,30], + compressiveYieldStrainStress: [-0.00173,-95], + compressiveFractureStrainStress: [-0.00273,-125], + }), + }, + granite: { + baseColorFactor: [0.8,0.8,0.8,1], + metallicFactor: 0, + roughnessFactor: 0.6, + irReflectance: 0.15, + irEmission: 0, + emissionMode: 0, + restitution: 0.12, + emissiveFactor: [0,0,0], + density: 2700, + viscosity: 0, + heatCapacity: 830, + thermalConductivity: 1.4, + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0.00222,100], + tensileFractureStrainStress: [0.0032,120], + compressiveYieldStrainStress: [-0.00422,-190], + compressiveFractureStrainStress: [-0.00555,-230], + }), + }, + metaRed: { + ...metaMaterialBase, + baseColorFactor: [1,0,0,1], + }, + metaOrange: { + ...metaMaterialBase, + baseColorFactor: [1,0.5,0,1], + }, + metaYellow: { + ...metaMaterialBase, + baseColorFactor: [1,1,0,1], + }, + metaLime: { + ...metaMaterialBase, + baseColorFactor: [0.5,1,0,1], + }, + metaGreen: { + ...metaMaterialBase, + baseColorFactor: [0,1,0,1], + }, + metaTeal: { + ...metaMaterialBase, + baseColorFactor: [0,1,0.5,1], + }, + metaCyan: { + ...metaMaterialBase, + baseColorFactor: [0,1,1,1], + }, + metaBlue: { + ...metaMaterialBase, + baseColorFactor: [0,0.5,1,1], + }, + metaIndigo: { + ...metaMaterialBase, + baseColorFactor: [0.25,0,1,1], + }, + metaViolet: { + ...metaMaterialBase, + baseColorFactor: [0.5,0,1,1], + }, + metaPurple: { + ...metaMaterialBase, + baseColorFactor: [0.75,0,1,1], + }, + metaMagenta: { + ...metaMaterialBase, + baseColorFactor: [1,0,1,1], + }, + metaPink: { + ...metaMaterialBase, + baseColorFactor: [1,0.5,0.75,1], + }, + metaWhite: { + ...metaMaterialBase, + baseColorFactor: [1,1,1,1], + }, + metaGray: { + ...metaMaterialBase, + baseColorFactor: [0.5,0.5,0.5,1], + }, + metaBlack: { + ...metaMaterialBase, + baseColorFactor: [0,0,0,1], + }, +} as const satisfies Record>; diff --git a/packages/data-gpu/src/material/emission-mode.ts b/packages/data-gpu/src/material/emission-mode.ts new file mode 100644 index 00000000..de931e2f --- /dev/null +++ b/packages/data-gpu/src/material/emission-mode.ts @@ -0,0 +1,11 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +/** Visible emission interpretation (matches legacy material schema). */ +export const EmissionMode = { + /** UV fluorescence — emissive does not add to visible output. */ + uvFluorescence: 0, + /** Visible luminescence — `emissiveFactor` + `irEmission` contribute to the lit color. */ + visibleLuminescence: 1, +} as const; + +export type EmissionMode = (typeof EmissionMode)[keyof typeof EmissionMode]; diff --git a/packages/data-gpu/src/material/json/from-json-string.ts b/packages/data-gpu/src/material/json/from-json-string.ts new file mode 100644 index 00000000..6a1d36cc --- /dev/null +++ b/packages/data-gpu/src/material/json/from-json-string.ts @@ -0,0 +1,11 @@ +import { fromJson, type FromJsonResult } from "./from-json.js"; + +export const fromJsonString = (text: string): FromJsonResult => { + let parsed: unknown; + try { + parsed = JSON.parse(text); + } catch { + return { ok: false, reason: "not_object" }; + } + return fromJson(parsed); +}; diff --git a/packages/data-gpu/src/material/json/from-json.test.ts b/packages/data-gpu/src/material/json/from-json.test.ts new file mode 100644 index 00000000..1ddd938c --- /dev/null +++ b/packages/data-gpu/src/material/json/from-json.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from "vitest"; +import { fromJson } from "./from-json.js"; +import { fromJsonString } from "./from-json-string.js"; + +const airJson = { + baseColor: [1, 1, 1, 0], + metallic: 0, + roughness: 0, + irReflectance: 0, + irEmission: 0, + emissionRgb: [0, 0, 0], + emissionMode: 0, + density: 1.225, + viscosity: 0, + specificHeatCapacity: 1006, + thermalConductivity: 0.024, + stressStrainCurve: { + tensileYieldStrainStress: [0, 0], + tensileFractureStrainStress: [0, 0], + compressiveYieldStrainStress: [0, 0], + compressiveFractureStrainStress: [0, 0], + }, + restitution: 0, +} as const; + +describe("fromJson", () => { + it("parses a name → props library object", () => { + const result = fromJson({ air: airJson, rock: airJson }); + + expect(result.ok).toBe(true); + if (!result.ok) return; + + expect(Object.keys(result.definitions)).toEqual(["air", "rock"]); + expect(result.definitions.air?.density).toBe(1.225); + expect(result.definitions.air?.heatCapacity).toBe(1006); + expect(result.definitions.air?.metallicFactor).toBe(0); + }); + + it("rejects invalid entries", () => { + const result = fromJson({ bad: { metallic: 1 } }); + expect(result).toEqual({ ok: false, reason: "invalid_entry", name: "bad" }); + }); +}); + +describe("fromJsonString", () => { + it("parses JSON text", () => { + const result = fromJsonString(JSON.stringify({ air: airJson })); + expect(result.ok).toBe(true); + }); +}); diff --git a/packages/data-gpu/src/material/json/from-json.ts b/packages/data-gpu/src/material/json/from-json.ts new file mode 100644 index 00000000..71dfff94 --- /dev/null +++ b/packages/data-gpu/src/material/json/from-json.ts @@ -0,0 +1,23 @@ +import type { MaterialDefinition } from "../material-definition.js"; +import { toDefinitionFromUnknown } from "./to-definition.js"; + +export type FromJsonResult = + | { readonly ok: true; readonly definitions: Readonly> } + | { readonly ok: false; readonly reason: "not_object" | "invalid_entry"; readonly name?: string }; + +export const fromJson = (input: unknown): FromJsonResult => { + if (typeof input !== "object" || input === null || Array.isArray(input)) { + return { ok: false, reason: "not_object" }; + } + + const definitions: Record = {}; + for (const [name, props] of Object.entries(input)) { + const definition = toDefinitionFromUnknown(props as Record); + if (!definition) { + return { ok: false, reason: "invalid_entry", name }; + } + definitions[name] = definition; + } + + return { ok: true, definitions }; +}; diff --git a/packages/data-gpu/src/material/json/is-properties-json.ts b/packages/data-gpu/src/material/json/is-properties-json.ts new file mode 100644 index 00000000..7170dcd7 --- /dev/null +++ b/packages/data-gpu/src/material/json/is-properties-json.ts @@ -0,0 +1,77 @@ +import type { PropertiesJson } from "./properties-json.js"; + +const isNumber = (value: unknown): value is number => + typeof value === "number" && Number.isFinite(value); + +const isVec2 = (value: unknown): value is readonly [number, number] => + Array.isArray(value) + && value.length === 2 + && isNumber(value[0]) + && isNumber(value[1]); + +const isVec3 = (value: unknown): value is readonly [number, number, number] => + Array.isArray(value) + && value.length === 3 + && isNumber(value[0]) + && isNumber(value[1]) + && isNumber(value[2]); + +const isVec4 = (value: unknown): value is readonly [number, number, number, number] => + Array.isArray(value) + && value.length === 4 + && isNumber(value[0]) + && isNumber(value[1]) + && isNumber(value[2]) + && isNumber(value[3]); + +const isStressStrainCurveJson = ( + value: unknown, +): value is PropertiesJson["stressStrainCurve"] => { + if (typeof value !== "object" || value === null) return false; + const curve = value as Record; + return ( + isVec2(curve.tensileYieldStrainStress) + && isVec2(curve.tensileFractureStrainStress) + && isVec2(curve.compressiveYieldStrainStress) + && isVec2(curve.compressiveFractureStrainStress) + ); +}; + +const readVec4 = (props: Record): readonly [number, number, number, number] | null => { + if (isVec4(props.baseColorFactor)) return props.baseColorFactor; + if (isVec4(props.baseColor)) return props.baseColor; + return null; +}; + +const readVec3 = (props: Record): readonly [number, number, number] | null => { + if (isVec3(props.emissiveFactor)) return props.emissiveFactor; + if (isVec3(props.emissionRgb)) return props.emissionRgb; + return null; +}; + +const readNumber = (props: Record, ...keys: string[]): number | null => { + for (const key of keys) { + if (isNumber(props[key])) return props[key]; + } + return null; +}; + +export const isPropertiesJson = (value: unknown): value is PropertiesJson => { + if (typeof value !== "object" || value === null) return false; + const props = value as Record; + return ( + readVec4(props) !== null + && readVec3(props) !== null + && isNumber(props.metallicFactor ?? props.metallic) + && isNumber(props.roughnessFactor ?? props.roughness) + && isNumber(props.irReflectance) + && isNumber(props.irEmission) + && isNumber(props.emissionMode) + && isNumber(props.density) + && isNumber(props.viscosity) + && isNumber(props.heatCapacity ?? props.specificHeatCapacity) + && isNumber(props.thermalConductivity) + && isStressStrainCurveJson(props.stressStrainCurve) + && isNumber(props.restitution) + ); +}; diff --git a/packages/data-gpu/src/material/json/library-json.ts b/packages/data-gpu/src/material/json/library-json.ts new file mode 100644 index 00000000..04ea3aa9 --- /dev/null +++ b/packages/data-gpu/src/material/json/library-json.ts @@ -0,0 +1,4 @@ +import type { MaterialDefinition } from "../material-definition.js"; + +/** name → material property bundle, as authored in a JSON library file. */ +export type LibraryJson = Readonly>; diff --git a/packages/data-gpu/src/material/json/load-json.ts b/packages/data-gpu/src/material/json/load-json.ts new file mode 100644 index 00000000..6c810fdc --- /dev/null +++ b/packages/data-gpu/src/material/json/load-json.ts @@ -0,0 +1,15 @@ +import { fromJsonString } from "./from-json-string.js"; +import type { FromJsonResult } from "./from-json.js"; + +export type LoadJsonResult = + | FromJsonResult + | { readonly ok: false; readonly reason: "fetch_failed"; readonly status: number }; + +export const loadJson = async (url: string): Promise => { + const response = await fetch(url); + if (!response.ok) { + return { ok: false, reason: "fetch_failed", status: response.status }; + } + const text = await response.text(); + return fromJsonString(text); +}; diff --git a/packages/data-gpu/src/material/json/properties-json.ts b/packages/data-gpu/src/material/json/properties-json.ts new file mode 100644 index 00000000..adb6b3bb --- /dev/null +++ b/packages/data-gpu/src/material/json/properties-json.ts @@ -0,0 +1,25 @@ +/** One material entry in a material library JSON file. */ +export type PropertiesJson = { + readonly baseColorFactor: readonly [number, number, number, number]; + readonly emissiveFactor: readonly [number, number, number]; + readonly metallicFactor: number; + readonly roughnessFactor: number; + readonly irReflectance: number; + readonly irEmission: number; + readonly emissionMode: number; + readonly density: number; + readonly viscosity: number; + readonly heatCapacity: number; + readonly thermalConductivity: number; + readonly restitution: number; + readonly friction?: number; + readonly compliance?: number; + readonly normalScale?: number; + readonly occlusionStrength?: number; + readonly stressStrainCurve: { + readonly tensileYieldStrainStress: readonly [number, number]; + readonly tensileFractureStrainStress: readonly [number, number]; + readonly compressiveYieldStrainStress: readonly [number, number]; + readonly compressiveFractureStrainStress: readonly [number, number]; + }; +}; diff --git a/packages/data-gpu/src/material/json/public.ts b/packages/data-gpu/src/material/json/public.ts new file mode 100644 index 00000000..0013b7b9 --- /dev/null +++ b/packages/data-gpu/src/material/json/public.ts @@ -0,0 +1,9 @@ +export type { LibraryJson } from "./library-json.js"; +export type { PropertiesJson } from "./properties-json.js"; +export type { FromJsonResult } from "./from-json.js"; +export type { LoadJsonResult } from "./load-json.js"; +export { isPropertiesJson } from "./is-properties-json.js"; +export { toDefinition } from "./to-definition.js"; +export { fromJson } from "./from-json.js"; +export { fromJsonString } from "./from-json-string.js"; +export { loadJson } from "./load-json.js"; diff --git a/packages/data-gpu/src/material/json/to-definition.ts b/packages/data-gpu/src/material/json/to-definition.ts new file mode 100644 index 00000000..02b4f6a6 --- /dev/null +++ b/packages/data-gpu/src/material/json/to-definition.ts @@ -0,0 +1,70 @@ +import { solidDefaults } from "../material-defaults.js"; +import type { MaterialDefinition } from "../material-definition.js"; +import { StressStrainCurve } from "../stress-strain-curve/stress-strain-curve.js"; +import type { PropertiesJson } from "./properties-json.js"; + +export const toDefinition = (props: PropertiesJson): MaterialDefinition => ({ + baseColorFactor: [...props.baseColorFactor], + emissiveFactor: [...props.emissiveFactor], + metallicFactor: props.metallicFactor, + roughnessFactor: props.roughnessFactor, + irReflectance: props.irReflectance, + irEmission: props.irEmission, + emissionMode: props.emissionMode, + restitution: props.restitution, + density: props.density, + viscosity: props.viscosity, + heatCapacity: props.heatCapacity, + thermalConductivity: props.thermalConductivity, + friction: props.friction ?? solidDefaults.friction, + compliance: props.compliance ?? solidDefaults.compliance, + normalScale: props.normalScale ?? solidDefaults.normalScale, + occlusionStrength: props.occlusionStrength ?? solidDefaults.occlusionStrength, + baseColorUrl: "", + metallicRoughnessUrl: "", + normalUrl: "", + occlusionUrl: "", + emissiveUrl: "", + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [...props.stressStrainCurve.tensileYieldStrainStress], + tensileFractureStrainStress: [...props.stressStrainCurve.tensileFractureStrainStress], + compressiveYieldStrainStress: [...props.stressStrainCurve.compressiveYieldStrainStress], + compressiveFractureStrainStress: [...props.stressStrainCurve.compressiveFractureStrainStress], + }), +}); + +/** Accept legacy JSON field names (baseColor, metallic, specificHeatCapacity, …). */ +export const toDefinitionFromUnknown = (props: Record): MaterialDefinition | null => { + const baseColorFactor = props.baseColorFactor ?? props.baseColor; + const emissiveFactor = props.emissiveFactor ?? props.emissionRgb; + const metallicFactor = props.metallicFactor ?? props.metallic; + const roughnessFactor = props.roughnessFactor ?? props.roughness; + const heatCapacity = props.heatCapacity ?? props.specificHeatCapacity; + if ( + !Array.isArray(baseColorFactor) || baseColorFactor.length !== 4 + || !Array.isArray(emissiveFactor) || emissiveFactor.length !== 3 + || typeof metallicFactor !== "number" + || typeof roughnessFactor !== "number" + || typeof heatCapacity !== "number" + || typeof props.stressStrainCurve !== "object" + ) { + return null; + } + return toDefinition({ + baseColorFactor: baseColorFactor as unknown as PropertiesJson["baseColorFactor"], + emissiveFactor: emissiveFactor as unknown as PropertiesJson["emissiveFactor"], + metallicFactor: metallicFactor as number, + roughnessFactor: roughnessFactor as number, + irReflectance: (props.irReflectance as number) ?? 0, + irEmission: (props.irEmission as number) ?? 0, + emissionMode: (props.emissionMode as number) ?? 0, + density: props.density as number, + viscosity: (props.viscosity as number) ?? 0, + heatCapacity: heatCapacity as number, + thermalConductivity: (props.thermalConductivity as number) ?? 0, + restitution: (props.restitution as number) ?? 0, + friction: props.friction as number | undefined, + compliance: props.compliance as number | undefined, + stressStrainCurve: props.stressStrainCurve as PropertiesJson["stressStrainCurve"], + }); +}; diff --git a/packages/data-gpu/src/material/material-defaults.ts b/packages/data-gpu/src/material/material-defaults.ts new file mode 100644 index 00000000..8a518a1f --- /dev/null +++ b/packages/data-gpu/src/material/material-defaults.ts @@ -0,0 +1,26 @@ +import type { MaterialDefinition } from "./material-definition.js"; +import { StressStrainCurve } from "./stress-strain-curve/stress-strain-curve.js"; + +/** Shared defaults for solid materials missing optional simulation / PBR fields. */ +export const solidDefaults = { + friction: 0.5, + compliance: 1e-8, + normalScale: 1, + occlusionStrength: 1, + viscosity: 0, + thermalConductivity: 0, + irReflectance: 0, + irEmission: 0, + emissionMode: 0, + baseColorUrl: "", + metallicRoughnessUrl: "", + normalUrl: "", + occlusionUrl: "", + emissiveUrl: "", + stressStrainCurve: StressStrainCurve.create({ + tensileYieldStrainStress: [0, 0], + tensileFractureStrainStress: [0, 0], + compressiveYieldStrainStress: [0, 0], + compressiveFractureStrainStress: [0, 0], + }), +} as const satisfies Partial; diff --git a/packages/data-gpu/src/material/material-definition.ts b/packages/data-gpu/src/material/material-definition.ts new file mode 100644 index 00000000..acd44e1c --- /dev/null +++ b/packages/data-gpu/src/material/material-definition.ts @@ -0,0 +1,4 @@ +import type { Material } from "./material.js"; + +/** Material property bundle without registry name (defaults merged at insert). */ +export type MaterialDefinition = Partial>; diff --git a/packages/data-gpu/src/material/material-name.ts b/packages/data-gpu/src/material/material-name.ts new file mode 100644 index 00000000..74798f35 --- /dev/null +++ b/packages/data-gpu/src/material/material-name.ts @@ -0,0 +1,3 @@ +import type { definitions } from "./definitions.js"; + +export type MaterialName = keyof typeof definitions; diff --git a/packages/data-gpu/src/material/material-plugin.test.ts b/packages/data-gpu/src/material/material-plugin.test.ts new file mode 100644 index 00000000..4c616010 --- /dev/null +++ b/packages/data-gpu/src/material/material-plugin.test.ts @@ -0,0 +1,97 @@ +import { describe, expect, it } from "vitest"; +import { Database } from "@adobe/data/ecs"; +import { plugin } from "./material-plugin.js"; +import { assembleMaterialRow } from "./assemble-material-row.js"; +import { requireMaterial } from "./require-material.js"; +import { solidDefaults } from "./material-defaults.js"; +import { StressStrainCurve } from "./stress-strain-curve/stress-strain-curve.js"; + +const noSolidCurve = StressStrainCurve.create({ + tensileYieldStrainStress: [0, 0], + tensileFractureStrainStress: [0, 0], + compressiveYieldStrainStress: [0, 0], + compressiveFractureStrainStress: [0, 0], +}); + +const rockRow = { + name: "rock", + ...solidDefaults, + baseColorFactor: [0.5, 0.5, 0.5, 1] as const, + emissiveFactor: [0, 0, 0] as const, + metallicFactor: 0, + roughnessFactor: 0.8, + irReflectance: 0.1, + irEmission: 0, + emissionMode: 0, + restitution: 0.15, + density: 2650, + viscosity: 0, + heatCapacity: 800, + thermalConductivity: 4, + stressStrainCurve: noSolidCurve, +}; + +describe("materialByName index", () => { + it("returns the material entity for a known name", () => { + const db = Database.create(plugin); + const rock = db.transactions.insertMaterial(rockRow); + expect(db.indexes.materialByName.get({ name: "rock" })).toBe(rock); + }); + + it("returns null for an unknown name", () => { + const db = Database.create(plugin); + expect(db.indexes.materialByName.get({ name: "missing" })).toBeNull(); + }); + + it("is populated by seedStandardMaterials", () => { + const db = Database.create(plugin); + db.transactions.seedStandardMaterials(); + expect(db.indexes.materialByName.get({ name: "steel" })).not.toBeNull(); + expect(db.indexes.materialByName.get({ name: "ice" })).not.toBeNull(); + }); + + it("rejects duplicate material names", () => { + const db = Database.create(plugin); + db.transactions.insertMaterial(rockRow); + expect(() => db.transactions.insertMaterial(rockRow)).toThrow(/Unique index conflict/); + }); + + it("insertMaterial validates required fields", () => { + const db = Database.create(plugin); + expect(() => db.transactions.insertMaterial({ ...rockRow, density: undefined as unknown as number })).toThrow(/missing required fields.*density/); + }); +}); + +describe("requireMaterial", () => { + it("returns the material entity for a known name", () => { + const db = Database.create(plugin); + const rock = db.transactions.insertMaterial(rockRow); + expect(requireMaterial(db, "rock")).toBe(rock); + }); + + it("throws when the material was never seeded", () => { + const db = Database.create(plugin); + expect(() => requireMaterial(db, "missing")).toThrow(/Material "missing" is not in the registry/); + }); +}); + +describe("assembleMaterialRow", () => { + it("throws when a required field is missing from the definition", () => { + expect(() => assembleMaterialRow("bad", { baseColorFactor: [1, 1, 1, 1] })).toThrow(/missing required fields.*density/); + }); + + it("merges solidDefaults and returns a full row", () => { + const row = assembleMaterialRow("rock", { + baseColorFactor: [0.5, 0.5, 0.5, 1], + emissiveFactor: [0, 0, 0], + metallicFactor: 0, + roughnessFactor: 0.8, + density: 2650, + restitution: 0.15, + heatCapacity: 800, + }); + expect(row.name).toBe("rock"); + expect(row.density).toBe(2650); + expect(row.friction).toBe(solidDefaults.friction); + }); +}); diff --git a/packages/data-gpu/src/material/material-plugin.ts b/packages/data-gpu/src/material/material-plugin.ts index 59aea4b3..00eb4113 100644 --- a/packages/data-gpu/src/material/material-plugin.ts +++ b/packages/data-gpu/src/material/material-plugin.ts @@ -1,61 +1,89 @@ -// © 2026 Adobe. MIT License. See /LICENSE for details. - import { Database, Entity } from "@adobe/data/ecs"; -import { F32, Vec3, Vec4 } from "@adobe/data/math"; +import { F32, U32, Vec3, Vec4 } from "@adobe/data/math"; +import { definitions } from "./definitions.js"; +import type { Material } from "./material.js"; +import type { MaterialDefinition } from "./material-definition.js"; +import type { MaterialName } from "./material-name.js"; +import { solidDefaults } from "./material-defaults.js"; +import { assembleMaterialRow } from "./assemble-material-row.js"; import { standardMaterials } from "./standard-materials.js"; +import { StressStrainCurve } from "./stress-strain-curve/stress-strain-curve.js"; /** - * The material registry — authored materials as ECS entities (an open set; - * added rarely, edited never). Each `Material` row carries physical props (read - * by any solver) and visible PBR factors + texture-source URLs (read by the - * renderer). A body / model references a material by `Entity` id; the - * render-side `materialGpu` plugin derives GPU textures + a palette from these - * rows and caches them, rebuilding only when a new material appears. - * - * `seedStandardMaterials` inserts the standard library and records a - * `name → Entity` lookup in the `materials` resource. + * Material registry — each material type is one `Material` entity with every + * property as its own ECS component. Bodies reference a material by entity id. + * Lookup by name via `indexes.materialByName`. */ export const plugin = Database.Plugin.create({ components: { - /** Reference (on a body, prop, or model) to a Material registry entity. */ - material: Entity.schema, - name: { type: "string" }, - density: F32.schema, - restitution: F32.schema, - friction: F32.schema, - compliance: F32.schema, - heatCapacity: F32.schema, - baseColorFactor: Vec4.schema, - emissiveFactor: Vec3.schema, - metallicFactor: F32.schema, - roughnessFactor: F32.schema, - normalScale: F32.schema, - occlusionStrength: F32.schema, - baseColorUrl: { type: "string" }, + /** Reference on a body, prop, or voxel to a Material registry entity. */ + material: Entity.schema, + name: { type: "string" }, + // rigid-body physics + density: F32.schema, + restitution: F32.schema, + friction: F32.schema, + compliance: F32.schema, + heatCapacity: F32.schema, + // simulation + viscosity: F32.schema, + thermalConductivity: F32.schema, + stressStrainCurve: StressStrainCurve.schema, + // visible PBR + baseColorFactor: Vec4.schema, + emissiveFactor: Vec3.schema, + metallicFactor: F32.schema, + roughnessFactor: F32.schema, + normalScale: F32.schema, + occlusionStrength: F32.schema, + irReflectance: F32.schema, + irEmission: F32.schema, + emissionMode: U32.schema, + // texture sources + baseColorUrl: { type: "string" }, metallicRoughnessUrl: { type: "string" }, - normalUrl: { type: "string" }, - occlusionUrl: { type: "string" }, - emissiveUrl: { type: "string" }, - }, - resources: { - /** name → Material entity, populated by `seedStandardMaterials`. */ - materials: { default: {} as Record }, + normalUrl: { type: "string" }, + occlusionUrl: { type: "string" }, + emissiveUrl: { type: "string" }, }, archetypes: { Material: [ "name", "density", "restitution", "friction", "compliance", "heatCapacity", - "baseColorFactor", "emissiveFactor", "metallicFactor", "roughnessFactor", "normalScale", "occlusionStrength", + "viscosity", "thermalConductivity", "stressStrainCurve", + "baseColorFactor", "emissiveFactor", "metallicFactor", "roughnessFactor", + "normalScale", "occlusionStrength", "irReflectance", "irEmission", "emissionMode", "baseColorUrl", "metallicRoughnessUrl", "normalUrl", "occlusionUrl", "emissiveUrl", ], }, + indexes: { + materialByName: { key: "name", unique: true, archetype: "Material" }, + }, transactions: { + insertMaterial(t, row: Material): Entity { + const { name, ...definition } = row; + return t.archetypes.Material.insert(assembleMaterialRow(name, definition)); + }, + insertMaterialDefinition(t, args: { name: string; definition: MaterialDefinition }): Entity { + return t.archetypes.Material.insert(assembleMaterialRow(args.name, args.definition)); + }, + insertMaterialDefinitions(t, defs: Readonly>): void { + for (const [name, definition] of Object.entries(defs)) { + t.archetypes.Material.insert(assembleMaterialRow(name, definition)); + } + }, + /** Textured PBR library used by graphics samples (rubber, wood, stone, steel, ice). */ seedStandardMaterials(t) { - const map: Record = {}; - for (const m of standardMaterials) { - map[m.name] = t.archetypes.Material.insert(m); + for (const row of standardMaterials) { + const { name, ...definition } = row; + t.archetypes.Material.insert(assembleMaterialRow(name, definition)); + } + }, + /** Solid material library from `definitions` (authored catalog). */ + seedDefinitionMaterials(t) { + for (const name of Object.keys(definitions) as MaterialName[]) { + t.archetypes.Material.insert(assembleMaterialRow(name, definitions[name])); } - t.resources.materials = map; }, }, }); diff --git a/packages/data-gpu/src/material/material.ts b/packages/data-gpu/src/material/material.ts index 332b6215..2da7166d 100644 --- a/packages/data-gpu/src/material/material.ts +++ b/packages/data-gpu/src/material/material.ts @@ -1,38 +1,39 @@ -// © 2026 Adobe. MIT License. See /LICENSE for details. - import type { Vec3, Vec4 } from "@adobe/data/math"; +import type { StressStrainCurve } from "./stress-strain-curve/stress-strain-curve.js"; + +/** One row of the `Material` archetype — one entity per material type. */ +export type Material = { + readonly name: string; + + // rigid-body physics + readonly density: number; + readonly restitution: number; + readonly friction: number; + readonly compliance: number; + readonly heatCapacity: number; + + // simulation (thermal / fluid / mechanical) + readonly viscosity: number; + readonly thermalConductivity: number; + readonly stressStrainCurve: StressStrainCurve; + + // visible PBR factors + readonly baseColorFactor: Vec4; + readonly emissiveFactor: Vec3; + readonly metallicFactor: number; + readonly roughnessFactor: number; + readonly normalScale: number; + readonly occlusionStrength: number; + readonly irReflectance: number; + readonly irEmission: number; + readonly emissionMode: number; -/** - * One row of the `Material` archetype — an authored material carrying both its - * physical properties (read by any physics solver) and its visible PBR - * properties (read by the renderer / material-array builder). Materials are an - * open, data-driven registry, not a closed enum: add a row, never edit code. - * - * Texture maps are *sources* (URLs) fetched at runtime; `""` means "use the - * neutral fallback layer". `metallicRoughnessUrl` and `occlusionUrl` may point - * at the same ARM image (AO = R, Roughness = G, Metalness = B). - */ -export interface Material { - name: string; - // physical (read by any solver) - density: number; - restitution: number; - friction: number; - compliance: number; - heatCapacity: number; - // visible PBR factors (multipliers over the sampled maps) - baseColorFactor: Vec4; - emissiveFactor: Vec3; - metallicFactor: number; - roughnessFactor: number; - normalScale: number; - occlusionStrength: number; - // texture sources, fetched at runtime ("" = neutral fallback layer) - baseColorUrl: string; - metallicRoughnessUrl: string; - normalUrl: string; - occlusionUrl: string; - emissiveUrl: string; -} + // texture sources ("" = factor-only / neutral GPU layer) + readonly baseColorUrl: string; + readonly metallicRoughnessUrl: string; + readonly normalUrl: string; + readonly occlusionUrl: string; + readonly emissiveUrl: string; +}; export * as Material from "./public.js"; diff --git a/packages/data-gpu/src/material/public.ts b/packages/data-gpu/src/material/public.ts index 36a4c45e..0e93a472 100644 --- a/packages/data-gpu/src/material/public.ts +++ b/packages/data-gpu/src/material/public.ts @@ -1,4 +1,12 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. export { plugin } from "./material-plugin.js"; +export { EmissionMode } from "./emission-mode.js"; +export { assembleMaterialRow } from "./assemble-material-row.js"; +export { requireMaterial } from "./require-material.js"; +export type { MaterialByNameLookup } from "./require-material.js"; export { standardMaterials } from "./standard-materials.js"; +export { definitions } from "./definitions.js"; +export { solidDefaults } from "./material-defaults.js"; +export type { MaterialName } from "./material-name.js"; +export * as MaterialJson from "./json/public.js"; diff --git a/packages/data-gpu/src/material/require-material.ts b/packages/data-gpu/src/material/require-material.ts new file mode 100644 index 00000000..9f46baa8 --- /dev/null +++ b/packages/data-gpu/src/material/require-material.ts @@ -0,0 +1,21 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { Entity } from "@adobe/data/ecs"; + +/** Store or transaction surface that exposes the material name index. */ +export interface MaterialByNameLookup { + indexes: { + materialByName: { get(args: { name: string }): Entity | null }; + }; +} + +/** Returns the material entity for `name`, or throws if it was never seeded. */ +export const requireMaterial = (db: MaterialByNameLookup, name: string): Entity => { + const material = db.indexes.materialByName.get({ name }); + if (material == null) { + throw new Error( + `Material "${name}" is not in the registry — seed materials first (seedStandardMaterials or seedDefinitionMaterials).`, + ); + } + return material; +}; diff --git a/packages/data-gpu/src/material/standard-materials.ts b/packages/data-gpu/src/material/standard-materials.ts index aab113a5..e857b5e4 100644 --- a/packages/data-gpu/src/material/standard-materials.ts +++ b/packages/data-gpu/src/material/standard-materials.ts @@ -1,43 +1,39 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. -// -// PBR texture maps © Poly Haven, CC0 (https://polyhaven.com). Fetched at -// runtime by URL — never committed (see data-gpu-samples/CLAUDE.md). Poly -// Haven's `arm` map packs AO(R) / Roughness(G) / Metalness(B), matching glTF's -// occlusion + metallicRoughness channel conventions. import type { Material } from "./material.js"; +import { solidDefaults } from "./material-defaults.js"; -const tex = (slug: string, map: string): string => - `https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/${slug}/${slug}_${map}_1k.jpg`; - -/** - * A standard material: physical constants (the old material table) plus neutral - * visible factors — the textures supply colour / roughness / metalness, so the - * factors are left at 1 and baseColor white. - */ -function standard( - name: string, slug: string, +/** Factor-only sample materials (no map URLs — rendered via `pbrFactorRender`). */ +function factor( + name: string, + baseColorFactor: [number, number, number, number], + metallicFactor: number, + roughnessFactor: number, density: number, restitution: number, friction: number, compliance: number, heatCapacity: number, ): Material { return { name, + ...solidDefaults, density, restitution, friction, compliance, heatCapacity, - baseColorFactor: [1, 1, 1, 1], + baseColorFactor, emissiveFactor: [0, 0, 0], - metallicFactor: 1, roughnessFactor: 1, normalScale: 1, occlusionStrength: 1, - baseColorUrl: tex(slug, "diff"), - metallicRoughnessUrl: tex(slug, "arm"), - normalUrl: tex(slug, "nor_gl"), - occlusionUrl: tex(slug, "arm"), + metallicFactor, + roughnessFactor, + baseColorUrl: "", + metallicRoughnessUrl: "", + normalUrl: "", + occlusionUrl: "", emissiveUrl: "", }; } -/** The standard material library, seeded by `seedStandardMaterials`. */ +/** Small factor library seeded by `seedStandardMaterials`. */ +export const standardMaterialNames = ["rubber", "wood", "stone", "steel", "ice"] as const; + export const standardMaterials: readonly Material[] = [ - standard("rubber", "rubber_tiles", 1.1, 0.80, 0.90, 1e-5, 2.0), - standard("wood", "wood_table_001", 0.6, 0.35, 0.70, 5e-7, 1.7), - standard("stone", "cobblestone_floor_08", 2.6, 0.20, 0.85, 1e-8, 0.8), - standard("steel", "metal_plate", 7.8, 0.45, 0.50, 1e-9, 0.5), - standard("ice", "snow_02", 0.92, 0.25, 0.05, 5e-9, 2.1), + factor("rubber", [0.15, 0.15, 0.15, 1], 0.0, 0.90, 1.1, 0.80, 0.90, 1e-5, 2.0), + factor("wood", [0.55, 0.35, 0.20, 1], 0.0, 0.75, 0.6, 0.35, 0.70, 5e-7, 1.7), + factor("stone", [0.45, 0.43, 0.40, 1], 0.05, 0.85, 2.6, 0.20, 0.85, 1e-8, 0.8), + factor("steel", [0.70, 0.72, 0.75, 1], 0.9, 0.35, 7.8, 0.45, 0.50, 1e-9, 0.5), + factor("ice", [0.85, 0.92, 0.95, 1], 0.0, 0.15, 0.92, 0.25, 0.05, 5e-9, 2.1), ]; diff --git a/packages/data-gpu/src/material/stress-strain-curve/create.ts b/packages/data-gpu/src/material/stress-strain-curve/create.ts new file mode 100644 index 00000000..8f669522 --- /dev/null +++ b/packages/data-gpu/src/material/stress-strain-curve/create.ts @@ -0,0 +1,9 @@ +import type { Vec2 } from "@adobe/data/math"; +import type { StressStrainCurve } from "./stress-strain-curve.js"; + +export const create = (args: { + readonly tensileYieldStrainStress: Vec2; + readonly tensileFractureStrainStress: Vec2; + readonly compressiveYieldStrainStress: Vec2; + readonly compressiveFractureStrainStress: Vec2; +}): StressStrainCurve => args; diff --git a/packages/data-gpu/src/material/stress-strain-curve/public.ts b/packages/data-gpu/src/material/stress-strain-curve/public.ts new file mode 100644 index 00000000..35e342c4 --- /dev/null +++ b/packages/data-gpu/src/material/stress-strain-curve/public.ts @@ -0,0 +1,2 @@ +export { schema } from "./schema.js"; +export { create } from "./create.js"; diff --git a/packages/data-gpu/src/material/stress-strain-curve/schema.test.ts b/packages/data-gpu/src/material/stress-strain-curve/schema.test.ts new file mode 100644 index 00000000..83d7218b --- /dev/null +++ b/packages/data-gpu/src/material/stress-strain-curve/schema.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; +import { getStructLayout } from "@adobe/data/typed-buffer"; +import { StressStrainCurve } from "./stress-strain-curve.js"; + +describe("StressStrainCurve.schema — struct layout", () => { + it("is a valid struct layout", () => { + expect(() => getStructLayout(StressStrainCurve.schema)).not.toThrow(); + }); + + it("uses packed layout with four vec2 fields", () => { + const layout = getStructLayout(StressStrainCurve.schema); + + expect(layout.layout).toBe("packed"); + expect(layout.size).toBe(32); + expect(layout.fields.tensileYieldStrainStress.offset).toBe(0); + expect(layout.fields.tensileFractureStrainStress.offset).toBe(8); + expect(layout.fields.compressiveYieldStrainStress.offset).toBe(16); + expect(layout.fields.compressiveFractureStrainStress.offset).toBe(24); + }); +}); diff --git a/packages/data-gpu/src/material/stress-strain-curve/schema.ts b/packages/data-gpu/src/material/stress-strain-curve/schema.ts new file mode 100644 index 00000000..9fb7122f --- /dev/null +++ b/packages/data-gpu/src/material/stress-strain-curve/schema.ts @@ -0,0 +1,20 @@ +import { Vec2 } from "@adobe/data/math"; +import { Schema } from "@adobe/data/schema"; + +/** Uniaxial bilinear σ–ε curve points. Each Vec2 is [engineering strain, stress MPa]. */ +export const schema = { + type: "object", + layout: "packed", + properties: { + tensileYieldStrainStress: Vec2.schema, + tensileFractureStrainStress: Vec2.schema, + compressiveYieldStrainStress: Vec2.schema, + compressiveFractureStrainStress: Vec2.schema, + }, + required: [ + "tensileYieldStrainStress", + "tensileFractureStrainStress", + "compressiveYieldStrainStress", + "compressiveFractureStrainStress", + ], +} as const satisfies Schema; diff --git a/packages/data-gpu/src/material/stress-strain-curve/stress-strain-curve.ts b/packages/data-gpu/src/material/stress-strain-curve/stress-strain-curve.ts new file mode 100644 index 00000000..4e04c46b --- /dev/null +++ b/packages/data-gpu/src/material/stress-strain-curve/stress-strain-curve.ts @@ -0,0 +1,11 @@ +import { Schema } from "@adobe/data/schema"; +import type { Assert, Equal } from "@adobe/data/types"; +import { schema } from "./schema.js"; + +export type StressStrainCurve = Schema.ToType; + +type _StressStrainCurveMatchesSchema = Assert< + Equal> +>; + +export * as StressStrainCurve from "./public.js"; diff --git a/packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.test.ts b/packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.test.ts new file mode 100644 index 00000000..749f1c8c --- /dev/null +++ b/packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.test.ts @@ -0,0 +1,8 @@ +import { describe, expect, it } from "vitest"; +import { massFromVolume } from "./mass-from-volume.js"; + +describe("massFromVolume", () => { + it("multiplies volume by density", () => { + expect(massFromVolume(2, 1000)).toBe(2000); + }); +}); diff --git a/packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.ts b/packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.ts new file mode 100644 index 00000000..695873a7 --- /dev/null +++ b/packages/data-gpu/src/physics/body/collider-shape/mass-from-volume.ts @@ -0,0 +1,4 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +/** Mass (kg) from collider volume (m³) and material density (kg/m³). */ +export const massFromVolume = (volume: number, density: number): number => volume * density; diff --git a/packages/data-gpu/src/physics/solvers/jolt-solver-plugin.ts b/packages/data-gpu/src/physics/solvers/jolt-solver-plugin.ts index c2c0b344..b06cdd32 100644 --- a/packages/data-gpu/src/physics/solvers/jolt-solver-plugin.ts +++ b/packages/data-gpu/src/physics/solvers/jolt-solver-plugin.ts @@ -9,6 +9,7 @@ import { jointData } from "../joint/joint-plugin.js"; import { BodyType } from "../body/body-type/body-type.js"; import { ColliderShape } from "../body/collider-shape/collider-shape.js"; import type { ColliderMesh } from "../body/collider-mesh.js"; +import { massFromVolume } from "../body/collider-shape/mass-from-volume.js"; /** * A third rigid-body solver behind the same `physicsData` seam — Jolt Physics @@ -60,7 +61,7 @@ type JVec3 = InstanceType; type JShape = InstanceType; type JPhysicsSystem = InstanceType; -interface MatProps { restitution: number; friction: number } +interface MatProps { density: number; restitution: number; friction: number } /** The live Jolt world, published once WASM init completes, so Jolt-native * extensions (e.g. `joltRagdoll`) can add their own bodies/constraints into the @@ -95,8 +96,8 @@ export const joltSolver = Database.Plugin.create({ const bodies = new Map(); // entity → Jolt body const matPropsOf = (id: Entity): MatProps => { - const m = db.store.read(id) as { restitution?: number; friction?: number } | null; - return { restitution: m?.restitution ?? 0.2, friction: m?.friction ?? 0.5 }; + const m = db.store.read(id) as { density?: number; restitution?: number; friction?: number } | null; + return { density: m?.density ?? 1, restitution: m?.restitution ?? 0.2, friction: m?.friction ?? 0.5 }; }; // hull/mesh colliders may be auto-generated from a model that's still @@ -197,6 +198,16 @@ export const joltSolver = Database.Plugin.create({ const settings = new jolt.BodyCreationSettings(shp, pos, rot, motionType, layer); settings.mRestitution = m.restitution; settings.mFriction = m.friction; + if (motion === "dynamic") { + const volume = shp.GetVolume(); + if (volume > 0) { + const mp = shp.GetMassProperties(); + mp.ScaleToMass(massFromVolume(volume, m.density)); + settings.mOverrideMassProperties = jolt.EOverrideMassProperties_MassAndInertiaProvided; + settings.mMassPropertiesOverride = mp; + jolt.destroy(mp); + } + } const body = bi.CreateBody(settings); bi.AddBody(body.GetID(), motion === "static" ? jolt.EActivation_DontActivate : jolt.EActivation_Activate); if (motion === "dynamic" && (vx || vy || vz || wx || wy || wz)) { diff --git a/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts b/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts new file mode 100644 index 00000000..a7014da2 --- /dev/null +++ b/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts @@ -0,0 +1,21 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { Entity } from "@adobe/data/ecs"; + +/** Store or transaction surface that exposes the voxel shape name index. */ +export interface VoxelShapeByNameLookup { + resources: { + _voxelShapeByName: Map | null; + }; +} + +/** Returns the baked-or-pending mesh entity for `name`, or throws if never seeded. */ +export const requireVoxelShape = (db: VoxelShapeByNameLookup, name: string): Entity => { + const mesh = db.resources._voxelShapeByName?.get(name) ?? null; + if (mesh == null) { + throw new Error( + `Voxel shape "${name}" is not in the registry — call seedVoxelShapeDefinitions first.`, + ); + } + return mesh; +}; diff --git a/packages/data-gpu/src/voxel-shape/volume-content-key.ts b/packages/data-gpu/src/voxel-shape/volume-content-key.ts new file mode 100644 index 00000000..f0c5ffd9 --- /dev/null +++ b/packages/data-gpu/src/voxel-shape/volume-content-key.ts @@ -0,0 +1,18 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import type { DenseVolume } from "@adobe/data/volume"; +import { booleanStorageByteLength } from "@adobe/data/typed-buffer"; + +/** Stable cache key from voxel grid size and packed occupancy bits. */ +export const volumeContentKey = (volume: DenseVolume): string => { + const [w, h, d] = volume.size; + const cellCount = w * h * d; + const bytes = booleanStorageByteLength(cellCount); + const words = volume.data.getTypedArray() as Uint32Array; + const view = new Uint8Array(words.buffer, words.byteOffset, bytes); + let hex = ""; + for (let i = 0; i < view.length; i++) { + hex += view[i]!.toString(16).padStart(2, "0"); + } + return `${w}x${h}x${d}:${hex}`; +}; diff --git a/packages/data-gpu/src/voxel-shape/voxel-shape-definitions.ts b/packages/data-gpu/src/voxel-shape/voxel-shape-definitions.ts new file mode 100644 index 00000000..276b046b --- /dev/null +++ b/packages/data-gpu/src/voxel-shape/voxel-shape-definitions.ts @@ -0,0 +1,61 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import { createTypedBuffer } from "@adobe/data/typed-buffer"; +import { Boolean } from "@adobe/data/schema"; +import { DenseVolume } from "@adobe/data/volume"; +import type { Vec3 } from "@adobe/data/math"; + +const fillVolume = ( + size: Vec3, + solid: (x: number, y: number, z: number) => boolean, +): DenseVolume => { + const [width, height, depth] = size; + const data = createTypedBuffer(Boolean.schema, width * height * depth); + const volume = DenseVolume.create({ size, data }); + for (let z = 0; z < depth; z++) { + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const index = DenseVolume.getIndex(volume, x, y, z); + if (solid(x, y, z)) { + data.set(index, true); + } + } + } + } + return volume; +}; + +/** Authored boolean voxel shapes — factories return fresh volumes with identical content. */ +export const definitions = { + /** Full 4³ block — reads as a plain cube when scaled to the collider. */ + solidCube: () => fillVolume([4, 4, 4], () => true), + + /** Three steps climbing along +Z. */ + stairStep: () => fillVolume([4, 4, 4], (x, y, z) => { + const step = Math.floor(z / 2); + return y <= step; + }), + + /** L-shaped footprint with an exterior corner notch. */ + lCorner: () => fillVolume([4, 4, 4], (x, _y, z) => x < 3 || z < 3), + + /** Plus sign extruded vertically through the center. */ + plusBeam: () => fillVolume([4, 4, 4], (x, y, z) => { + const onXArm = x === 1 || x === 2; + const onZArm = z === 1 || z === 2; + return (onXArm || onZArm) && y >= 1 && y <= 2; + }), + + /** Hollow frame — only the outer shell is solid. */ + hollowFrame: () => fillVolume([4, 4, 4], (x, y, z) => + x === 0 || x === 3 || y === 0 || y === 3 || z === 0 || z === 3), + + /** Small block with a corner spur — visibly non-cubic. */ + edgeSpur: () => fillVolume([4, 4, 4], (x, y, z) => { + if (x >= 2 && y >= 2 && z >= 2) return true; + if (x === 0 && y === 0 && z === 0) return true; + return false; + }), +} as const; + +export type VoxelShapeName = keyof typeof definitions; diff --git a/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts b/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts new file mode 100644 index 00000000..2a6adfb7 --- /dev/null +++ b/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts @@ -0,0 +1,124 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +import { Database, Entity } from "@adobe/data/ecs"; +import type { DenseVolume } from "@adobe/data/volume"; +import type { Vec3 } from "@adobe/data/math"; +import { physicsData } from "../physics/physics-data-plugin.js"; +import { mesh } from "../graphics/scene/model/mesh-plugin.js"; +import { shapeGeometry } from "../graphics/scene/model/shape/shape-geometry-plugin.js"; +import { physicsRenderBridge } from "../graphics/rendering/pbr-render/physics-bridge-plugin.js"; +import type { ShapeSpec } from "../graphics/scene/model/shape/shape-spec.js"; +import { definitions } from "./voxel-shape-definitions.js"; +import { volumeContentKey } from "./volume-content-key.js"; + +const insertVoxelShapeMesh = ( + t: { + resources: { + _voxelMeshByKey: Map | null; + _voxelVolumeByMesh: Map> | null; + }; + archetypes: { + ShapeMeshPending: { + insert: (row: { shapeSpec: ShapeSpec; voxelVolumeSize: Vec3 }) => Entity; + }; + }; + }, + args: { volume: DenseVolume }, +): Entity => { + const key = volumeContentKey(args.volume); + const byKey = t.resources._voxelMeshByKey ??= new Map(); + const existing = byKey.get(key); + if (existing != null) return existing; + + const id = t.archetypes.ShapeMeshPending.insert({ + shapeSpec: { kind: "voxelShape" }, + voxelVolumeSize: [...args.volume.size] as Vec3, + }); + (t.resources._voxelVolumeByMesh ??= new Map()).set(id, args.volume); + byKey.set(key, id); + return id; +}; + +/** + * voxelShape — registers authored boolean volumes, deduplicates mesh baking by + * volume content, and attaches baked mesh refs to bodies that reference them. + * Physics colliders stay unchanged; only the visual mesh is overridden. + */ +const RIGID_BODY_COMPONENTS = [ + "bodyType", + "colliderShape", + "halfExtents", + "material", + "position", + "rotation", + "linearVelocity", + "angularVelocity", +] as const; + +export const voxelShape = Database.Plugin.create({ + extends: Database.Plugin.combine(mesh, shapeGeometry, physicsData), + components: { + /** Body → baked (or pending) voxel mesh entity. Visual only. */ + voxelShape: Entity.schema, + }, + resources: { + _voxelMeshByKey: { default: null as Map | null, transient: true }, + _voxelShapeByName: { default: null as Map | null, transient: true }, + }, + archetypes: { + /** Same as RigidBody but carries a voxelShape mesh ref at insert time. */ + VoxelRigidBody: [...RIGID_BODY_COMPONENTS, "voxelShape"], + }, + transactions: { + insertVoxelShapeMesh(t, args: { volume: DenseVolume }): Entity { + return insertVoxelShapeMesh(t, args); + }, + seedVoxelShapeDefinitions(t) { + const byName = t.resources._voxelShapeByName ??= new Map(); + for (const [name, factory] of Object.entries(definitions)) { + byName.set(name, insertVoxelShapeMesh(t, { volume: factory() })); + } + }, + }, +}); + +/** Attaches voxel mesh refs to physics bodies after the default cube bridge runs. */ +export const voxelShapeVisualBridge = Database.Plugin.create({ + extends: Database.Plugin.combine(voxelShape, physicsRenderBridge), + systems: { + voxelShapeVisualBridge: { + schedule: { during: ["postUpdate"], after: ["physicsBridge"] }, + create: db => () => { + for (const arch of db.store.queryArchetypes(["voxelShape", "halfExtents"])) { + const ids = arch.columns.id; + const voxelShapes = arch.columns.voxelShape; + const halfExtents = arch.columns.halfExtents; + for (let i = arch.rowCount - 1; i >= 0; i--) { + const id = ids.get(i); + const meshId = voxelShapes.get(i); + const he = halfExtents.get(i); + const meshRow = db.store.read(meshId) as { + voxelVolumeSize?: Vec3 | null; + localBounds?: unknown; + }; + const volumeSize = meshRow.voxelVolumeSize; + // Wait until shapeMeshBake has produced a StaticMesh + _PbrPrimitive. + if (volumeSize == null || meshRow.localBounds == null) continue; + + const scale: Vec3 = [ + (2 * he[0]) / volumeSize[0], + (2 * he[1]) / volumeSize[1], + (2 * he[2]) / volumeSize[2], + ]; + const current = db.store.read(id) as { mesh?: Entity; scale?: Vec3 }; + if (current.mesh === meshId && current.scale?.[0] === scale[0]) continue; + db.store.update(id, { mesh: meshId, scale, visible: true }); + } + } + }, + }, + }, +}); + +/** Combined plugin for samples: voxel visuals + physics cube bridge. */ +export const voxelShapeRender = Database.Plugin.combine(voxelShape, voxelShapeVisualBridge); diff --git a/packages/data-gpu/src/voxel-shape/voxel-shape.ts b/packages/data-gpu/src/voxel-shape/voxel-shape.ts new file mode 100644 index 00000000..ea62cae5 --- /dev/null +++ b/packages/data-gpu/src/voxel-shape/voxel-shape.ts @@ -0,0 +1,6 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +export { definitions } from "./voxel-shape-definitions.js"; +export type { VoxelShapeName } from "./voxel-shape-definitions.js"; + +export * as VoxelShape from "./voxel-shape-definitions.js"; diff --git a/packages/data/package.json b/packages/data/package.json index e3b093c4..b5997d6b 100644 --- a/packages/data/package.json +++ b/packages/data/package.json @@ -131,6 +131,9 @@ ], "math": [ "./dist/math/index.d.ts" + ], + "volume": [ + "./dist/volume/index.d.ts" ] } }, @@ -187,6 +190,10 @@ "import": "./dist/math/index.js", "types": "./dist/math/index.d.ts" }, + "./volume": { + "import": "./dist/volume/index.js", + "types": "./dist/volume/index.d.ts" + }, "./equals-shallow": { "import": "./dist/equals-shallow.js", "types": "./dist/equals-shallow.d.ts" diff --git a/packages/data/src/functions/serialization/serialization.test.ts b/packages/data/src/functions/serialization/serialization.test.ts index 9cd6c372..d1e2a71d 100644 --- a/packages/data/src/functions/serialization/serialization.test.ts +++ b/packages/data/src/functions/serialization/serialization.test.ts @@ -236,4 +236,17 @@ describe('serialize/deserialize', () => { expect(roundTrip.buf.get(1)).toBe("c"); expect(roundTrip.buf.get(2)).toBe("a"); }); + + it('round-trips boolean typed buffers', () => { + const buf = createTypedBuffer({ type: "boolean" }, 65); + buf.set(0, true); + buf.set(32, true); + buf.set(64, true); + + const payload = serialize({ buf }); + const roundTrip = deserialize<{ buf: TypedBuffer }>(payload); + + expect(roundTrip.buf.type).toBe("boolean"); + expect(equals(roundTrip.buf, buf)).toBe(true); + }); }); \ No newline at end of file diff --git a/packages/data/src/table/copy-column-to-gpu-buffer.ts b/packages/data/src/table/copy-column-to-gpu-buffer.ts index 83e46611..752a7336 100644 --- a/packages/data/src/table/copy-column-to-gpu-buffer.ts +++ b/packages/data/src/table/copy-column-to-gpu-buffer.ts @@ -1,7 +1,16 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. +import { booleanStorageByteLength } from "../typed-buffer/create-boolean-buffer.js"; import { Table } from "./table.js"; +const columnByteLength = >(table: T, columnName: keyof T["columns"]): number => { + const column = table.columns[columnName]; + if (column.type === "boolean") { + return booleanStorageByteLength(table.rowCount); + } + return table.rowCount * column.typedArrayElementSizeInBytes; +}; + /** * Copies a column from an array of tables to a GPU buffer. */ @@ -14,7 +23,7 @@ export const copyColumnToGPUBuffer = , K extends keyof T["c // get total byte length let totalByteLength = 0; for (const table of tables) { - totalByteLength += table.rowCount * table.columns[columnName].typedArrayElementSizeInBytes; + totalByteLength += columnByteLength(table, columnName); } // ensure the gpu buffer is large enough if (gpuBuffer.size < totalByteLength) { @@ -25,7 +34,7 @@ export const copyColumnToGPUBuffer = , K extends keyof T["c let offset = 0; for (const table of tables) { const column = table.columns[columnName]; - const writeByteLength = table.rowCount * column.typedArrayElementSizeInBytes; + const writeByteLength = columnByteLength(table, columnName); const array = column.getTypedArray(); device.queue.writeBuffer(gpuBuffer, offset, array.buffer, 0, writeByteLength); offset += writeByteLength; diff --git a/packages/data/src/typed-buffer/create-boolean-buffer.test.ts b/packages/data/src/typed-buffer/create-boolean-buffer.test.ts new file mode 100644 index 00000000..451876ed --- /dev/null +++ b/packages/data/src/typed-buffer/create-boolean-buffer.test.ts @@ -0,0 +1,184 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. +import { describe, it, expect } from "vitest"; +import { Boolean } from "../schema/boolean/index.js"; +import { createTypedBuffer } from "./create-typed-buffer.js"; +import { + booleanStorageByteLength, + booleanWordCount, + createBooleanBuffer, +} from "./create-boolean-buffer.js"; +import { TypedBuffer } from "./typed-buffer.js"; +import { equals } from "../equals.js"; +import { serialize, deserialize } from "../functions/serialization/serialize.js"; + +describe("createBooleanBuffer", () => { + it("should be chosen automatically for boolean schemas", () => { + const buffer = createTypedBuffer(Boolean.schema, 64); + expect(buffer.type).toBe("boolean"); + }); + + it("should still use const buffer for boolean const schemas", () => { + const buffer = createTypedBuffer({ type: "boolean", const: true, default: true }, 4); + expect(buffer.type).toBe("const"); + }); + + it("should allocate one u32 word per 32 booleans", () => { + expect(booleanWordCount(1)).toBe(1); + expect(booleanWordCount(32)).toBe(1); + expect(booleanWordCount(33)).toBe(2); + expect(booleanStorageByteLength(33)).toBe(8); + }); + + it("should default all bits to false", () => { + const buffer = createBooleanBuffer(Boolean.schema, 40); + for (let i = 0; i < 40; i++) { + expect(buffer.get(i)).toBe(false); + expect(buffer.isDefault(i)).toBe(true); + } + }); + + it("should get and set individual bits", () => { + const buffer = createBooleanBuffer(Boolean.schema, 100); + buffer.set(0, true); + buffer.set(31, true); + buffer.set(32, true); + buffer.set(63, true); + buffer.set(99, true); + + expect(buffer.get(0)).toBe(true); + expect(buffer.get(31)).toBe(true); + expect(buffer.get(32)).toBe(true); + expect(buffer.get(63)).toBe(true); + expect(buffer.get(99)).toBe(true); + expect(buffer.get(1)).toBe(false); + expect(buffer.get(33)).toBe(false); + expect(buffer.isDefault(1)).toBe(true); + expect(buffer.isDefault(0)).toBe(false); + }); + + it("should clear bits when set to false", () => { + const buffer = createBooleanBuffer(Boolean.schema, 8); + buffer.set(3, true); + expect(buffer.get(3)).toBe(true); + buffer.set(3, false); + expect(buffer.get(3)).toBe(false); + }); + + it("should initialize from boolean arrays via createTypedBuffer", () => { + const buffer = createTypedBuffer(Boolean.schema, [true, false, true, true]); + expect(buffer.type).toBe("boolean"); + expect(buffer.capacity).toBe(4); + expect(buffer.get(0)).toBe(true); + expect(buffer.get(1)).toBe(false); + expect(buffer.get(2)).toBe(true); + expect(buffer.get(3)).toBe(true); + }); + + it("should expose packed storage as Uint32Array", () => { + const buffer = createBooleanBuffer(Boolean.schema, 32); + buffer.set(0, true); + buffer.set(31, true); + const words = buffer.getTypedArray() as Uint32Array; + expect(words.length).toBe(1); + expect(words[0]).toBe(0x80000001); + }); + + describe("copyWithin", () => { + it("should copy boolean ranges", () => { + const buffer = createBooleanBuffer(Boolean.schema, 8); + buffer.set(0, true); + buffer.set(1, true); + buffer.set(2, false); + buffer.copyWithin(2, 0, 2); + expect(buffer.get(2)).toBe(true); + expect(buffer.get(3)).toBe(true); + }); + + it("should copy overlapping ranges backward", () => { + const buffer = createBooleanBuffer(Boolean.schema, 4); + buffer.set(0, true); + buffer.set(1, false); + buffer.copyWithin(1, 0, 2); + expect(buffer.get(1)).toBe(true); + expect(buffer.get(2)).toBe(false); + }); + }); + + it("should resize capacity and preserve existing bits", () => { + const buffer = createBooleanBuffer(Boolean.schema, 10); + buffer.set(0, true); + buffer.set(9, true); + buffer.capacity = 40; + expect(buffer.get(0)).toBe(true); + expect(buffer.get(9)).toBe(true); + expect(buffer.getTypedArray().length).toBe(booleanWordCount(40)); + }); + + it("should copy to an independent buffer", () => { + const a = createBooleanBuffer(Boolean.schema, 5); + a.set(2, true); + const b = a.copy(); + expect(TypedBuffer.equals(a, b)).toBe(true); + a.set(2, false); + expect(b.get(2)).toBe(true); + }); + + it("should slice boolean values", () => { + const buffer = createTypedBuffer(Boolean.schema, [true, false, true]); + expect(Array.from(buffer.slice(1, 3))).toEqual([false, true]); + }); + + it("should round-trip through serialization", () => { + const original = createTypedBuffer(Boolean.schema, 65); + original.set(0, true); + original.set(31, true); + original.set(32, true); + original.set(64, true); + + const payload = serialize({ buf: original }); + const roundTrip = deserialize<{ buf: TypedBuffer }>(payload); + + expect(roundTrip.buf.type).toBe("boolean"); + expect(roundTrip.buf.capacity).toBe(65); + expect(equals(roundTrip.buf, original)).toBe(true); + }); + + it("should deserialize legacy array-serialized boolean buffers", () => { + const legacyPayload = { + json: JSON.stringify({ + buf: { + codec: "typed-buffer", + json: { + type: "array", + schema: Boolean.schema, + capacity: 4, + array: [true, false, true, true], + }, + binaryIndex: 0, + binaryCount: 0, + }, + }), + binary: [], + }; + + const roundTrip = deserialize<{ buf: TypedBuffer }>(legacyPayload); + expect(roundTrip.buf.type).toBe("boolean"); + expect(roundTrip.buf.get(0)).toBe(true); + expect(roundTrip.buf.get(1)).toBe(false); + expect(roundTrip.buf.get(2)).toBe(true); + expect(roundTrip.buf.get(3)).toBe(true); + }); + + it("should reset ephemeral boolean buffers on deserialize", () => { + const ephemeral = createTypedBuffer({ ...Boolean.schema, ephemeral: true }, 10); + ephemeral.set(0, true); + ephemeral.set(9, true); + + const payload = serialize({ ephemeral }); + const roundTrip = deserialize<{ ephemeral: TypedBuffer }>(payload); + + expect(roundTrip.ephemeral.capacity).toBe(10); + expect(roundTrip.ephemeral.get(0)).toBe(false); + expect(roundTrip.ephemeral.get(9)).toBe(false); + }); +}); diff --git a/packages/data/src/typed-buffer/create-boolean-buffer.ts b/packages/data/src/typed-buffer/create-boolean-buffer.ts new file mode 100644 index 00000000..3b53c5e7 --- /dev/null +++ b/packages/data/src/typed-buffer/create-boolean-buffer.ts @@ -0,0 +1,109 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. +import { resize } from "../internal/array-buffer-like/resize.js"; +import { TypedArray } from "../internal/typed-array/index.js"; +import { Schema } from "../schema/index.js"; +import { createSharedArrayBuffer } from "../internal/shared-array-buffer/create-shared-array-buffer.js"; +import { TypedBuffer, TypedBufferType } from "./typed-buffer.js"; + +export const booleanBufferType = "boolean"; + +export const booleanWordCount = (capacity: number): number => + Math.ceil(capacity / 32); + +export const booleanStorageByteLength = (capacity: number): number => + booleanWordCount(capacity) * 4; + +const getBit = (words: Uint32Array, index: number): boolean => + ((words[index >>> 5] >>> (index & 31)) & 1) !== 0; + +const setBit = (words: Uint32Array, index: number, value: boolean): void => { + const wordIndex = index >>> 5; + const bitIndex = index & 31; + if (value) { + words[wordIndex] |= 1 << bitIndex; + } else { + words[wordIndex] &= ~(1 << bitIndex); + } +}; + +class BooleanTypedBuffer extends TypedBuffer { + public readonly type: TypedBufferType = booleanBufferType; + public readonly typedArrayElementSizeInBytes = 0; + + private arrayBuffer: ArrayBuffer | SharedArrayBuffer; + private array: Uint32Array; + private _capacity: number; + + constructor(schema: Schema, initialCapacity: number) { + super(schema); + this._capacity = initialCapacity; + const wordCount = booleanWordCount(initialCapacity); + this.arrayBuffer = createSharedArrayBuffer(wordCount * 4); + this.array = new Uint32Array(this.arrayBuffer); + } + + get capacity(): number { + return this._capacity; + } + + set capacity(value: number) { + if (value !== this._capacity) { + this._capacity = value; + this.arrayBuffer = resize(this.arrayBuffer, booleanStorageByteLength(value)); + this.array = new Uint32Array(this.arrayBuffer); + } + } + + getTypedArray(): TypedArray { + return this.array; + } + + get(index: number): boolean { + return getBit(this.array, index); + } + + set(index: number, value: boolean): void { + setBit(this.array, index, value); + } + + isDefault(index: number): boolean { + return !this.get(index); + } + + copyWithin(target: number, start: number, end: number): void { + if (target === start || end <= start) { + return; + } + const count = end - start; + if (target < start || target >= end) { + for (let i = 0; i < count; i++) { + this.set(target + i, this.get(start + i)); + } + } else { + for (let i = count - 1; i >= 0; i--) { + this.set(target + i, this.get(start + i)); + } + } + } + + slice(start = 0, end = this._capacity): ArrayLike & Iterable { + const result = new Array(Math.max(0, end - start)); + for (let i = start; i < end; i++) { + result[i - start] = this.get(i); + } + return result; + } + + copy(): TypedBuffer { + const copy = new BooleanTypedBuffer(this.schema, this._capacity); + copy.array.set(this.array); + return copy; + } +} + +export const createBooleanBuffer = ( + schema: Schema, + initialCapacity: number, +): TypedBuffer => { + return new BooleanTypedBuffer(schema, initialCapacity); +}; diff --git a/packages/data/src/typed-buffer/create-typed-buffer.ts b/packages/data/src/typed-buffer/create-typed-buffer.ts index 66d59890..2acea275 100644 --- a/packages/data/src/typed-buffer/create-typed-buffer.ts +++ b/packages/data/src/typed-buffer/create-typed-buffer.ts @@ -7,6 +7,7 @@ import { createNumberBuffer } from "./create-number-buffer.js"; import { createArrayBuffer } from "./create-array-buffer.js"; import { createConstBuffer } from "./create-const-buffer.js"; import { createEnumBuffer } from "./create-enum-buffer.js"; +import { createBooleanBuffer } from "./create-boolean-buffer.js"; export function createTypedBuffer ( schema: S, @@ -43,6 +44,10 @@ function createTypedBufferInternal ( return createEnumBuffer(schema, initialCapacity) as TypedBuffer>; } + if (schema.type === "boolean") { + return createBooleanBuffer(schema, initialCapacity) as TypedBuffer>; + } + if (schema.type === 'number' || schema.type === 'integer') { return createNumberBuffer(schema, initialCapacity) as TypedBuffer>; } diff --git a/packages/data/src/typed-buffer/index.ts b/packages/data/src/typed-buffer/index.ts index 2ed0c412..498476f5 100644 --- a/packages/data/src/typed-buffer/index.ts +++ b/packages/data/src/typed-buffer/index.ts @@ -5,4 +5,5 @@ export * from './create-typed-buffer.js'; export * from './create-struct-buffer.js'; export * from './structs/index.js'; export { copyToGPUBuffer } from './copy-to-gpu-buffer.js'; +export { booleanStorageByteLength, booleanWordCount } from './create-boolean-buffer.js'; export type { DataView32 } from './data-view-32.js'; diff --git a/packages/data/src/typed-buffer/register-typed-buffer-codecs.ts b/packages/data/src/typed-buffer/register-typed-buffer-codecs.ts index 93605ed0..605e267e 100644 --- a/packages/data/src/typed-buffer/register-typed-buffer-codecs.ts +++ b/packages/data/src/typed-buffer/register-typed-buffer-codecs.ts @@ -8,6 +8,7 @@ import { createArrayBuffer } from "./create-array-buffer.js"; import { createConstBuffer } from "./create-const-buffer.js"; import { createNumberBuffer } from "./create-number-buffer.js"; import { createEnumBuffer } from "./create-enum-buffer.js"; +import { createBooleanBuffer } from "./create-boolean-buffer.js"; import { createStructBuffer } from "./create-struct-buffer.js"; import { isTypedBuffer } from "./is-typed-buffer.js"; import { TypedBuffer, TypedBufferType } from "./typed-buffer.js"; @@ -25,7 +26,7 @@ export function registerTypedBufferCodecs() { else if (type === "array") { return { json: { type, schema, capacity, array: data.slice() as unknown as any[] } }; } - else if (type === "enum" || type === "number" || type === "struct") { + else if (type === "boolean" || type === "enum" || type === "number" || type === "struct") { const typedArray = data.getTypedArray(); const view = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); return { json: { type, schema, capacity }, binary: [toArrayBufferBacked(view)] }; @@ -47,9 +48,12 @@ export function registerTypedBufferCodecs() { } else if (type === "array") { const isEnum = schema.enum !== undefined && schema.enum.length > 0; + const isBoolean = schema.type === "boolean"; const buffer = isEnum ? createEnumBuffer(schema, capacity) - : createArrayBuffer(schema, capacity); + : isBoolean + ? createBooleanBuffer(schema, capacity) + : createArrayBuffer(schema, capacity); if (schema.ephemeral) { if (schema.default !== undefined && schema.default !== 0) { for (let i = 0; i < capacity; i++) { @@ -64,6 +68,19 @@ export function registerTypedBufferCodecs() { } return buffer; } + else if (type === "boolean") { + const buffer = createBooleanBuffer(schema, capacity); + if (!schema.ephemeral) { + if (binary[0]) { + copyViewBytes(binary[0], buffer.getTypedArray()); + } else if (array) { + for (let i = 0; i < capacity; i++) { + buffer.set(i, array[i]); + } + } + } + return buffer; + } else if (type === "enum") { const buffer = createEnumBuffer(schema, capacity); if (!schema.ephemeral) { diff --git a/packages/data/src/typed-buffer/typed-buffer.ts b/packages/data/src/typed-buffer/typed-buffer.ts index 769e4342..ca788c93 100644 --- a/packages/data/src/typed-buffer/typed-buffer.ts +++ b/packages/data/src/typed-buffer/typed-buffer.ts @@ -3,7 +3,7 @@ import { TypedArray } from "../internal/typed-array/index.js"; import { Schema } from "../schema/index.js"; import { typedBufferEquals } from "./typed-buffer-equals.js"; -export type TypedBufferType = "array" | "const" | "enum" | "number" | "struct"; +export type TypedBufferType = "array" | "boolean" | "const" | "enum" | "number" | "struct"; export interface ReadonlyTypedBuffer { readonly type: TypedBufferType; diff --git a/packages/data/src/volume/dense-volume/create.ts b/packages/data/src/volume/dense-volume/create.ts new file mode 100644 index 00000000..58fc24b8 --- /dev/null +++ b/packages/data/src/volume/dense-volume/create.ts @@ -0,0 +1,9 @@ + +import type { DenseVolume } from "./dense-volume.js"; + +export const create = (volume: Omit, "type">): DenseVolume => { + return { + type: "dense", + ...volume, + }; +}; diff --git a/packages/data/src/volume/dense-volume/dense-volume.ts b/packages/data/src/volume/dense-volume/dense-volume.ts new file mode 100644 index 00000000..26e3f005 --- /dev/null +++ b/packages/data/src/volume/dense-volume/dense-volume.ts @@ -0,0 +1,10 @@ +import { Vec3 } from "../../math/vec3/index.js"; +import { TypedBuffer } from "../../typed-buffer/index.js"; + +export type DenseVolume = { + readonly type: "dense"; + readonly size: Vec3; + readonly data: TypedBuffer; +}; + +export * as DenseVolume from "./public.js"; diff --git a/packages/data/src/volume/dense-volume/equals.test.ts b/packages/data/src/volume/dense-volume/equals.test.ts new file mode 100644 index 00000000..5da89471 --- /dev/null +++ b/packages/data/src/volume/dense-volume/equals.test.ts @@ -0,0 +1,138 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. +import { describe, it, expect } from "vitest"; +import { createTypedBuffer } from "../../typed-buffer/index.js"; +import { Boolean } from "../../schema/boolean/index.js"; +import type { DenseVolume } from "./dense-volume.js"; +import { create } from "./create.js"; +import { equals } from "./equals.js"; +import { get } from "./get.js"; +import { getCoordinates } from "./get-coordinates.js"; +import { getIndex } from "./get-index.js"; +import { is } from "./is.js"; + +describe("DenseVolume.equals", () => { + describe("same reference", () => { + it("should return true for identical references", () => { + const volume: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + expect(equals(volume, volume)).toBe(true); + }); + }); + + describe("structural differences", () => { + it("should return false for different sizes", () => { + const volume1: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + const volume2: DenseVolume = { + type: "dense", + size: [3, 3, 3], + data: createTypedBuffer(Boolean.schema, 27), + }; + + expect(equals(volume1, volume2)).toBe(false); + }); + + it("should return false for different data", () => { + const volume1: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + const volume2: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + volume1.data.set(0, true); + volume2.data.set(0, false); + + expect(equals(volume1, volume2)).toBe(false); + }); + }); + + describe("identical volumes", () => { + it("should return true for volumes with same size and data", () => { + const volume1: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + const volume2: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + volume1.data.set(0, true); + volume1.data.set(1, true); + volume2.data.set(0, true); + volume2.data.set(1, true); + + expect(equals(volume1, volume2)).toBe(true); + }); + + it("should return true for empty volumes", () => { + const volume1: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + const volume2: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + expect(equals(volume1, volume2)).toBe(true); + }); + }); +}); + +describe("DenseVolume accessors", () => { + it("should compute linear indices and coordinates", () => { + const volume: DenseVolume = { + type: "dense", + size: [3, 2, 2], + data: createTypedBuffer(Boolean.schema, 12), + }; + + expect(getIndex(volume, 1, 1, 1)).toBe(10); + expect(getCoordinates(volume, 7)).toEqual([1, 0, 1]); + expect(getCoordinates(volume, 10)).toEqual([1, 1, 1]); + }); + + it("should get voxel values by coordinate", () => { + const volume: DenseVolume = { + type: "dense", + size: [2, 2, 2], + data: createTypedBuffer(Boolean.schema, 8), + }; + + volume.data.set(getIndex(volume, 1, 0, 0), true); + expect(get(volume, 1, 0, 0)).toBe(true); + expect(get(volume, 0, 0, 0)).toBe(false); + expect(get(volume, -1, 0, 0)).toBeNull(); + expect(get(volume, 2, 0, 0)).toBeNull(); + }); + + it("should identify dense volumes", () => { + const volume = create({ + size: [1, 1, 1], + data: createTypedBuffer(Boolean.schema, 1), + }); + expect(is(volume)).toBe(true); + expect(is({ type: "column" })).toBe(false); + }); +}); diff --git a/packages/data/src/volume/dense-volume/equals.ts b/packages/data/src/volume/dense-volume/equals.ts new file mode 100644 index 00000000..9f6a83e7 --- /dev/null +++ b/packages/data/src/volume/dense-volume/equals.ts @@ -0,0 +1,15 @@ +import { TypedBuffer } from "../../typed-buffer/index.js"; +import type { DenseVolume } from "./dense-volume.js"; + +const vec3Equals = (a: readonly [number, number, number], b: readonly [number, number, number]): boolean => + a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; + +/** + * Compare two DenseVolume instances for equality. + */ +export const equals = (a: DenseVolume, b: DenseVolume): boolean => { + if (a === b) return true; + if (a.type !== b.type) return false; + if (!vec3Equals(a.size, b.size)) return false; + return TypedBuffer.equals(a.data, b.data); +}; diff --git a/packages/data/src/volume/dense-volume/get-coordinates.ts b/packages/data/src/volume/dense-volume/get-coordinates.ts new file mode 100644 index 00000000..c14f30ac --- /dev/null +++ b/packages/data/src/volume/dense-volume/get-coordinates.ts @@ -0,0 +1,12 @@ + +import { Vec3 } from "../../math/vec3/index.js"; +import type { DenseVolume } from "./dense-volume.js"; +import type { Index } from "./index-type.js"; + +export const getCoordinates = (volume: DenseVolume, index: Index): Vec3 => { + const [width, height] = volume.size; + const z = Math.floor(index / (width * height)); + const y = Math.floor((index % (width * height)) / width); + const x = index % width; + return [x, y, z]; +}; diff --git a/packages/data/src/volume/dense-volume/get-index.ts b/packages/data/src/volume/dense-volume/get-index.ts new file mode 100644 index 00000000..005b1309 --- /dev/null +++ b/packages/data/src/volume/dense-volume/get-index.ts @@ -0,0 +1,11 @@ + +import type { DenseVolume } from "./dense-volume.js"; +import type { Index } from "./index-type.js"; + +/** + * Get the index of a voxel in a dense volume. + */ +export const getIndex = (volume: DenseVolume, x: number, y: number, z: number): Index => { + const [width, height] = volume.size; + return x + width * (y + z * height); +}; diff --git a/packages/data/src/volume/dense-volume/get.ts b/packages/data/src/volume/dense-volume/get.ts new file mode 100644 index 00000000..aa23a090 --- /dev/null +++ b/packages/data/src/volume/dense-volume/get.ts @@ -0,0 +1,17 @@ +import type { DenseVolume } from "./dense-volume.js"; +import { getIndex } from "./get-index.js"; + +/** + * Gets the voxel value at the specified coordinates in a DenseVolume. + * @returns The voxel value, or null if coordinates are out of bounds + */ +export const get = (volume: DenseVolume, x: number, y: number, z: number): T | null => { + const [width, height, depth] = volume.size; + + if (x < 0 || x >= width || y < 0 || y >= height || z < 0 || z >= depth) { + return null; + } + + const index = getIndex(volume, x, y, z); + return volume.data.get(index); +}; diff --git a/packages/data/src/volume/dense-volume/index-type.ts b/packages/data/src/volume/dense-volume/index-type.ts new file mode 100644 index 00000000..107c9d39 --- /dev/null +++ b/packages/data/src/volume/dense-volume/index-type.ts @@ -0,0 +1,2 @@ + +export type Index = number; diff --git a/packages/data/src/volume/dense-volume/is.ts b/packages/data/src/volume/dense-volume/is.ts new file mode 100644 index 00000000..403733c8 --- /dev/null +++ b/packages/data/src/volume/dense-volume/is.ts @@ -0,0 +1,9 @@ + +import type { DenseVolume } from "./dense-volume.js"; + +/** + * Type guard to check if a value is a DenseVolume. + */ +export const is = (value: { readonly type: string }): value is DenseVolume => { + return value.type === "dense"; +}; diff --git a/packages/data/src/volume/dense-volume/public.ts b/packages/data/src/volume/dense-volume/public.ts new file mode 100644 index 00000000..76cb94d5 --- /dev/null +++ b/packages/data/src/volume/dense-volume/public.ts @@ -0,0 +1,7 @@ +export * from "./equals.js"; +export * from "./is.js"; +export * from "./index-type.js"; +export * from "./get-index.js"; +export * from "./get-coordinates.js"; +export * from "./get.js"; +export * from "./create.js"; diff --git a/packages/data/src/volume/index.ts b/packages/data/src/volume/index.ts new file mode 100644 index 00000000..0ed795b1 --- /dev/null +++ b/packages/data/src/volume/index.ts @@ -0,0 +1,3 @@ +// © 2026 Adobe. MIT License. See /LICENSE for details. + +export * from "./dense-volume/dense-volume.js"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54069795..d12c2e4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -466,1315 +466,4763 @@ importers: packages: - /@asamuzakjp/css-color@3.2.0: + '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 10.4.3 - dev: true - /@assemblyscript/loader@0.27.30: + '@assemblyscript/loader@0.27.30': resolution: {integrity: sha512-ZHhTxGKMpTiHZKUTjQnu2z5FwEN2QSjVt5vRmFivCw58VyNVCfOnQNSsDa3J/MujE/SBBpicJo9FCtKUC1hP7A==} - dev: true - /@babel/code-frame@7.29.0: + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - dev: true - /@babel/compat-data@7.29.0: + '@babel/compat-data@7.29.0': resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.29.0: + '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.17.7: + '@babel/generator@7.17.7': resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - /@babel/generator@7.29.1: + '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - dev: true - /@babel/helper-compilation-targets@7.28.6: + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-environment-visitor@7.24.7: + '@babel/helper-environment-visitor@7.24.7': resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.29.0 - dev: true - /@babel/helper-function-name@7.24.7: + '@babel/helper-function-name@7.24.7': resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - dev: true - /@babel/helper-globals@7.28.0: + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-hoist-variables@7.24.7: + '@babel/helper-hoist-variables@7.24.7': resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.29.0 - dev: true - /@babel/helper-module-imports@7.18.6: + '@babel/helper-module-imports@7.18.6': resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.29.0 - dev: true - /@babel/helper-module-imports@7.28.6: + '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0): + '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-plugin-utils@7.28.6: + '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-split-export-declaration@7.24.7: + '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.29.0 - dev: true - /@babel/helper-string-parser@7.27.1: + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.28.5: + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.27.1: + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helpers@7.28.6: + '@babel/helpers@7.28.6': resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - dev: true - /@babel/parser@7.29.0: + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.29.0 - dev: true - /@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0): + '@babel/plugin-syntax-jsx@7.28.6': resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - dev: true - /@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0): + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - dev: true - /@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0): + '@babel/plugin-transform-react-jsx-source@7.27.1': resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - dev: true - /@babel/template@7.28.6: + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - dev: true - /@babel/traverse@7.23.2: + '@babel/traverse@7.23.2': resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/traverse@7.29.0: + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.17.0: + '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - to-fast-properties: 2.0.0 - dev: true - /@babel/types@7.29.0: + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - dev: true - /@cfworker/json-schema@4.1.1: + '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - dev: false - /@csstools/color-helpers@5.1.0: + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} - dev: true - /@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4): + '@csstools/css-calc@2.1.4': resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} engines: {node: '>=18'} peerDependencies: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - dev: true - /@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4): + '@csstools/css-color-parser@3.1.0': resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} peerDependencies: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - dev: true - /@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1): + '@csstools/css-parser-algorithms@2.7.1': resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: '@csstools/css-tokenizer': ^2.4.1 - dependencies: - '@csstools/css-tokenizer': 2.4.1 - dev: true - /@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4): + '@csstools/css-parser-algorithms@3.0.5': resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - dependencies: - '@csstools/css-tokenizer': 3.0.4 - dev: true - /@csstools/css-tokenizer@2.4.1: + '@csstools/css-tokenizer@2.4.1': resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} engines: {node: ^14 || ^16 || >=18} - dev: true - /@csstools/css-tokenizer@3.0.4: + '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - dev: true - /@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1): + '@csstools/media-query-list-parser@2.1.13': resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: '@csstools/css-parser-algorithms': ^2.7.1 '@csstools/css-tokenizer': ^2.4.1 - dependencies: - '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) - '@csstools/css-tokenizer': 2.4.1 - dev: true - /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2): + '@csstools/selector-specificity@3.1.1': resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 - dependencies: - postcss-selector-parser: 6.1.2 - dev: true - /@dimforge/rapier3d-compat@0.19.3: + '@dimforge/rapier3d-compat@0.19.3': resolution: {integrity: sha512-mMVdSj1PRTT108s9Swbu2GQOmHbn8kbJANRV5xfczL3s0T4vkgZAuoMRgvBzQcHanpKusbC0ZJj6z3mC3aj3vg==} - dev: false - /@esbuild/aix-ppc64@0.19.12: + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.25.12: + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.12: + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.25.12: + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.12: + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.25.12: + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.12: + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.25.12: + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.12: + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.25.12: + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.12: + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.25.12: + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.25.12: + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.12: + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.25.12: + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.12: + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.25.12: + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.12: + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.25.12: + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.12: + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.25.12: + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.12: + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.25.12: + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.12: + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.25.12: + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.12: + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.25.12: + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.12: + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.25.12: + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.12: + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.25.12: + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.12: + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.25.12: + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-arm64@0.25.12: + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.12: + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.25.12: + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-arm64@0.25.12: + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.12: + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.25.12: + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openharmony-arm64@0.25.12: + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.12: + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.25.12: + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.12: + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.25.12: + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.12: + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.25.12: + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.12: + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.25.12: + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.9.1(eslint@8.56.0): + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.12.2: + '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.14.0 - debug: 4.4.3(supports-color@5.5.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.56.0: + '@eslint/js@8.56.0': resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@floating-ui/core@1.7.4: + '@floating-ui/core@1.7.4': resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} - dependencies: - '@floating-ui/utils': 0.2.10 - dev: false - /@floating-ui/dom@1.7.5: + '@floating-ui/dom@1.7.5': resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} - dependencies: - '@floating-ui/core': 1.7.4 - '@floating-ui/utils': 0.2.10 - dev: false - /@floating-ui/utils@0.2.10: + '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - dev: false - /@gerrit0/mini-shiki@3.23.0: + '@gerrit0/mini-shiki@3.23.0': resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} - dependencies: - '@shikijs/engine-oniguruma': 3.23.0 - '@shikijs/langs': 3.23.0 - '@shikijs/themes': 3.23.0 - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - dev: true - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@5.5.0) - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.3: + '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - dev: true - /@isaacs/cliui@8.0.2: + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.10 - dev: true - /@jridgewell/gen-mapping@0.3.13: + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - dev: true - /@jridgewell/remapping@2.3.5: + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - dev: true - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.5.5: + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - dev: true - /@jridgewell/trace-mapping@0.3.31: + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - dev: true - /@lit-labs/observers@2.1.0: + '@lit-labs/observers@2.1.0': resolution: {integrity: sha512-oeQ2tvi/ygq7S+VgnXIInMKHHFPFqvIV9j2zBzpCwl33cWviT2ltuxNpbd11etwtUVsM8woKQzfVnrc80PKhKA==} - dependencies: - '@lit/reactive-element': 2.1.2 - dev: false - /@lit-labs/ssr-dom-shim@1.5.1: + '@lit-labs/ssr-dom-shim@1.5.1': resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} - /@lit/reactive-element@2.1.2: + '@lit/reactive-element@2.1.2': resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - /@ljharb/resumer@0.1.3: + '@ljharb/resumer@0.1.3': resolution: {integrity: sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw==} engines: {node: '>= 0.4'} - dependencies: - '@ljharb/through': 2.3.14 - call-bind: 1.0.8 - dev: true - /@ljharb/through@2.3.14: + '@ljharb/through@2.3.14': resolution: {integrity: sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - dev: true - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - dev: true - /@pixi/colord@2.9.6: + '@pixi/colord@2.9.6': resolution: {integrity: sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==} - dev: false - /@pixi/react@8.0.0-beta.25(@types/react@19.0.0)(pixi.js@8.2.6)(react@19.0.0): + '@pixi/react@8.0.0-beta.25': resolution: {integrity: sha512-nXZbWj6nBHoOhlN1hKjKCeSPWPcv4BGBe8Em8B2V/QrSiihKI4C2vaxvV6Q1udLGsLnv4Hv9EBVa0Ixe0QAdiQ==} peerDependencies: pixi.js: ^8.2.6 react: '>=19.0.0' - dependencies: - its-fine: 1.2.5(@types/react@19.0.0)(react@19.0.0) - pixi.js: 8.2.6 - react: 19.0.0 - react-reconciler: 0.31.0(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - dev: false - /@pkgjs/parseargs@0.11.0: + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@pkgr/core@0.1.2: + '@pkgr/core@0.1.2': resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true - /@polka/url@1.0.0-next.29: + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - dev: true - /@promptbook/utils@0.69.5: + '@promptbook/utils@0.69.5': resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} - dependencies: - spacetrim: 0.11.59 - dev: true - /@puppeteer/browsers@2.13.0: + '@puppeteer/browsers@2.13.0': resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} engines: {node: '>=18'} hasBin: true - dependencies: - debug: 4.4.3(supports-color@5.5.0) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.4 - tar-fs: 3.1.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - dev: true - /@rollup/rollup-android-arm-eabi@4.59.0: + '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.59.0: + '@rollup/rollup-android-arm64@4.59.0': resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.59.0: + '@rollup/rollup-darwin-arm64@4.59.0': resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.59.0: + '@rollup/rollup-darwin-x64@4.59.0': resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-freebsd-arm64@4.59.0: + '@rollup/rollup-freebsd-arm64@4.59.0': resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-freebsd-x64@4.59.0: + '@rollup/rollup-freebsd-x64@4.59.0': resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.59.0: + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.59.0: + '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.59.0: + '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.59.0: + '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-loong64-gnu@4.59.0: + '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-loong64-musl@4.59.0: + '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-ppc64-gnu@4.59.0: + '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-ppc64-musl@4.59.0: + '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.59.0: + '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-musl@4.59.0: + '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.59.0: + '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true + + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + cpu: [x64] + os: [win32] + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + + '@spectrum-web-components/action-button@1.7.0': + resolution: {integrity: sha512-BPC574O86P/ipvwAgQscf+qsc1kzCqtL+X7sCFCn15prRJaI4jE7Qpm8xMRJFMC6scw66fhbx+GEwqqyRKQ10Q==} + + '@spectrum-web-components/action-group@1.7.0': + resolution: {integrity: sha512-b0TFywEdIKfQ4fOnO1edwOyRLPHl2Ilq6rsT0NQJlpmrRCk192VOtvWODv5O2WfSvfLAOpW6rO79DT/IS+P/ig==} + + '@spectrum-web-components/asset@1.7.0': + resolution: {integrity: sha512-+H0kHAGbvJT6KWCLd0dIX1Fek9R2i2VwoRr09XdmwzG/X220vr5C2pf9zjPmPmDOoOal4XjlK9VO13x9wKlPSA==} + + '@spectrum-web-components/base@1.7.0': + resolution: {integrity: sha512-KYp/mvvFh7swi9x9/5Z+tYlA0Vd/Jc0BEPYEjphN2hpzh4uZNuFilMZWNYM7zDJvjZ/ZMIZzz4/Ugv6vIentZA==} + + '@spectrum-web-components/button@1.7.0': + resolution: {integrity: sha512-JMyJShFhCNVc/WXhsrlHswoz0B+w0R9JU00Spw8kgorQOZPwgIUWcNon/ZmA9X2ednsEympZIFsFLgqpch7whw==} + + '@spectrum-web-components/card@1.7.0': + resolution: {integrity: sha512-bZMUM0f10WmQoPHkIdl2oZYFpH2bEAKHh7EejFs6BlPJjEV/KC7s/G9l46jvX3nImW5zpd67vpr3IWjyMuGzKw==} + + '@spectrum-web-components/checkbox@1.7.0': + resolution: {integrity: sha512-vowZXD8cmj5cmgozZahjQaxFB7+FohgXmKUS2Dh/PGU6Upo5m3jnkWZBngP6c7DQyVOXlqzgZc6kxO3G+OvWxg==} + + '@spectrum-web-components/clear-button@1.7.0': + resolution: {integrity: sha512-eyfV9Rs5bJOa/+HSIcJIsvuRLpAIHHeL1gy1rfNFKNb7dvR2Egm12+N4ZsSx1DlOmWppPFVJp27udyZ+0PPgeQ==} + + '@spectrum-web-components/close-button@1.7.0': + resolution: {integrity: sha512-wvaI4HC75Gum+Xdzk+JzqleJRykiiZjU/4potkVgbqP8qYrGF+IEdFJRfH3t4ktthJbw54i0AsFE+iS5j6y6Cw==} + + '@spectrum-web-components/divider@1.7.0': + resolution: {integrity: sha512-2LLw6WPCnz8uNf++LtTfxQW69Be6+BsY2wtJJQhpih0yXSW1F7WVoIzkQZOzrVq1OV4OHx54MhdgHZ5vW5y3LA==} + + '@spectrum-web-components/icon@1.7.0': + resolution: {integrity: sha512-VLM2oIpOrak/u65gUMFax5FRkFPxm1C0ZRPnAAX3EcjJhgcyjTAO6S6I/rE3OB4hicowBWXUS3ImngM+puetUQ==} + + '@spectrum-web-components/icons-ui@1.7.0': + resolution: {integrity: sha512-lIWU5n+WtfMzpAmesi4BqMSqqGIjz95kqK98pv9dHHU5AryMpZdo+m767PwomnJdoRu04Z++kNNKvY+X5cQZ/w==} + + '@spectrum-web-components/icons-workflow@1.7.0': + resolution: {integrity: sha512-2zCoRqxPEe5h1TLx7SVWucfDCZIZwbQ+esgle8vZr0Zr2902jrn3UyiTJYBtyyShGyZNFTWNvablwT/ZoEU8Vw==} + + '@spectrum-web-components/iconset@1.7.0': + resolution: {integrity: sha512-KLUpXdFtAe12qwtEGrDI6UK406FLCbsKCbggK8z6hw8vIMDe9sVYWC6D0KInPx1ZSLwuzpT7TF2uCU2aKgD5ow==} + + '@spectrum-web-components/overlay@1.7.0': + resolution: {integrity: sha512-U2hcp6Z1X4sleod0TYb0Q2FCmXwcI/vjYu9yr/a7huUV5dAnE0DYBx1wz1/sM/cJru8m51zyNzCXid4f22WyJA==} + + '@spectrum-web-components/popover@1.7.0': + resolution: {integrity: sha512-SPZbhIszCAp/P3dqGkfjICnt4i/gBLi9zzsyUoL08KNBsELI89k6b3vQrtjuKTKhERcJ+JKdzQgMCAjyR6g+gg==} + + '@spectrum-web-components/progress-circle@1.7.0': + resolution: {integrity: sha512-xz0cRnRJcGCAfT519MrBZVVetMrhwlhYTzEeaWuDlgw+5Oe3gRbNcYNwKcmxXZ2q+GWDYMvGK3jQ9wtpIsVeOQ==} + + '@spectrum-web-components/reactive-controllers@1.7.0': + resolution: {integrity: sha512-BYrYuRGw2OaKnj5kxlfvHvDrEQMtwBl8zpTBHKJZrvnPHJFYANtcjhylvzIoDQCcRihekm8GDQIOqiL8I0BKhA==} + + '@spectrum-web-components/shared@1.7.0': + resolution: {integrity: sha512-7bjmYer5VuENWZgo9u+eHLtn+4ZTK1z76xamYgHpZZZXZu6S29TBtxeg0NbF0nZWqAxpJx4ICNPZ3ZTz8kW52A==} + + '@spectrum-web-components/styles@1.7.0': + resolution: {integrity: sha512-lWA+SB8qPZAtW6lUmAGYXSwWxmUM7UBsxZId2KWah/xDHj6Klh3bSm5JoDkMxK2E4YRd/2QYK/VDMdvk/HmNfw==} + + '@spectrum-web-components/theme@1.7.0': + resolution: {integrity: sha512-UXstgZwl7gDJCKJ7MoWSFt9iCDdf8d8SFb+HMQy9jW58/lUIpmrj46A6EX84Pk52K2F3VGF8OAEm3Pjl37VmsQ==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@trivago/prettier-plugin-sort-imports@4.3.0': + resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/css-font-loading-module@0.0.12': + resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==} + + '@types/earcut@2.1.4': + resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} + + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonpath@0.2.4': + resolution: {integrity: sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==} + + '@types/node@20.19.35': + resolution: {integrity: sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==} + + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + + '@types/parse-author@2.0.3': + resolution: {integrity: sha512-pgRW2K/GVQoogylrGJXDl7PBLW9A6T4OOc9Hy9MLT5f7vgufK2GQ8FcfAbjFHR5HjcN9ByzuCczAORk49REqoA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/react-dom@19.0.0': + resolution: {integrity: sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w==} + + '@types/react-reconciler@0.28.9': + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} + peerDependencies: + '@types/react': '*' + + '@types/react@19.0.0': + resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/sinonjs__fake-timers@8.1.5': + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/which@2.0.2': + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@4.3.0': + resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@vitest/browser@1.6.0': + resolution: {integrity: sha512-3Wpp9h1hf++rRVPvoXevkdHybLhJVn7MwIMKMIh08tVaoDMmT6fnNhbP222Z48V9PptpYeA5zvH9Ct/ZcaAzmQ==} + peerDependencies: + playwright: '*' + safaridriver: '*' + vitest: 1.6.0 + webdriverio: '*' + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + '@wdio/config@9.0.8': + resolution: {integrity: sha512-37L+hd+A1Nyehd/pgfTrLC6w+Ngbu0CIoFh9Vv6v8Cgu5Hih0TLofvlg+J1BNbcTd5eQ2tFKZBDeFMhQaIiTpg==} + engines: {node: '>=18.20.0'} + + '@wdio/logger@8.38.0': + resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} + engines: {node: ^16.13 || >=18} + + '@wdio/logger@9.0.8': + resolution: {integrity: sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==} + engines: {node: '>=18.20.0'} + + '@wdio/protocols@9.0.8': + resolution: {integrity: sha512-xRH54byFf623/w/KW62xkf/C2mGyigSfMm+UT3tNEAd5ZA9X2VAWQWQBPzdcrsck7Fxk4zlQX8Kb34RSs7Cy4Q==} + + '@wdio/repl@9.0.8': + resolution: {integrity: sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==} + engines: {node: '>=18.20.0'} + + '@wdio/types@9.0.8': + resolution: {integrity: sha512-pmz2iRWddTanrv8JC7v3wUGm17KRv2WyyJhQfklMSANn9V1ep6pw1RJG2WJnKq4NojMvH1nVv1sMZxXrYPhpYw==} + engines: {node: '>=18.20.0'} + + '@wdio/utils@9.0.8': + resolution: {integrity: sha512-p3EgOdkhCvMxJFd3WTtSChqYFQu2mz69/5tOsljDaL+4QYwnRR7O8M9wFsL3/9XMVcHdnC4Ija2VRxQ/lb+hHQ==} + engines: {node: '>=18.20.0'} + + '@webgpu/types@0.1.61': + resolution: {integrity: sha512-w2HbBvH+qO19SB5pJOJFKs533CdZqxl3fcGonqL321VHkW7W/iBo6H8bjDy6pr/+pbMwIu5dnuaAxH7NxBqUrQ==} + + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + '@zip.js/zip.js@2.8.21': + resolution: {integrity: sha512-fkyzXISE3IMrstDO1AgPkJCx14MYHP/suIGiAovEYEuBjq3mffsuL6aMV7ohOSjW4rXtuACuUfpA3GtITgdtYg==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.every@1.1.7: + resolution: {integrity: sha512-BIP72rKvrKd08ptbetLb4qvrlGjkv30yOKgKcTtOIbHyQt3shr/jyOzdApiCOh3LPYrpJo5M6i0zmVldOF2pUw==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assemblyscript@0.27.30: + resolution: {integrity: sha512-tSlwbLEDM1X+w/6/Y2psc3sEg9/7r+m7xv44G6FI2G/w1MNnnulLxcPo7FN0kVIBoD/oxCiRFGaQAanFY0gPhA==} + engines: {node: '>=16', npm: '>=7'} + hasBin: true + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + author-regex@1.0.0: + resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==} + engines: {node: '>=0.8'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + b4a@1.8.0: + resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + babel-plugin-jsx-dom-expressions@0.40.6: + resolution: {integrity: sha512-v3P1MW46Lm7VMpAkq0QfyzLWWkC8fh+0aE5Km4msIgDx5kjenHU0pF2s+4/NH8CQn/kla6+Hvws+2AF7bfV5qQ==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-preset-solid@1.9.12: + resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^1.9.12 + peerDependenciesMeta: + solid-js: + optional: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.5.5: + resolution: {integrity: sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.7.0: + resolution: {integrity: sha512-64Rcwj8qlnTZU8Ps6JJEdSmxBEUGgI7g8l+lMtsJLl4IsfTcHMTfJ188u2iGV6P6YPRZrtv72B2kjn+hp+Yv3g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.8.0: + resolution: {integrity: sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} + hasBin: true + + basic-ftp@5.2.0: + resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + engines: {node: '>=10.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + binaryen@116.0.0-nightly.20240114: + resolution: {integrity: sha512-0GZrojJnuhoe+hiwji7QFaL3tBlJoA+KFUN7ouYSDGZLSo9CKM8swQX8n/UcbR0d1VuZKU+nhogNzv423JEu5A==} + hasBin: true + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001774: + resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colorjs.io@0.5.2: + resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-shorthand-properties@1.1.2: + resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@6.0.1: + resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dotignore@0.1.2: + resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} + hasBin: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} + engines: {node: '>=14.0.0'} + + edgedriver@5.6.1: + resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} + hasBin: true + + electron-to-chromium@1.5.302: + resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-airbnb-base@15.0.0: + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + + eslint-config-airbnb-typescript@17.1.0: + resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0 + '@typescript-eslint/parser': ^5.0.0 || ^6.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-formatter-pretty@5.0.0: + resolution: {integrity: sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==} + engines: {node: '>=14.16'} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-header@3.1.1: + resolution: {integrity: sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==} + peerDependencies: + eslint: '>=7.7.0' + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-notice@0.9.10: + resolution: {integrity: sha512-rF79EuqdJKu9hhTmwUkNeSvLmmq03m/NXq/NHwUENHbdJ0wtoyOjxZBhW4QCug8v5xYE6cGe3AWkGqSIe9KUbQ==} + peerDependencies: + eslint: '>=3.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@1.2.2: + resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} + engines: {node: '>=0.4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@4.5.4: + resolution: {integrity: sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==} + hasBin: true + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + + focus-visible@5.2.1: + resolution: {integrity: sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + geckodriver@4.5.1: + resolution: {integrity: sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==} + engines: {node: ^16.13 || >=18 || >=20} + hasBin: true + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-dynamic-import@2.1.1: + resolution: {integrity: sha512-DuTCn6K/RW8S27npDMumGKsjG6HE7MxzedZka5tJP+9dqfxks+UMqKBmeCijHtIhsBEZPlbMg0qMHi2nKYVtKQ==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-wasm@4.12.0: + resolution: {integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + htmlfy@0.2.1: + resolution: {integrity: sha512-HoomFHQ3av1uhq+7FxJTq4Ns0clAD+tGbQNrSd0WFY3UAjjUk6G3LaWEqdgmIXYkY4pexZiyZ3ykZJhQlM0J5A==} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + ismobilejs@1.1.1: + resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} + + its-fine@1.2.5: + resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} + peerDependencies: + react: '>=18.0' + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + jolt-physics@1.0.0: + resolution: {integrity: sha512-rA7Mcb3CDqsDzr0J15P2DDftMR4d15/B6hfvvVh88Se3KFCYXGbPKGK2sJFGOpzUksRpyQhgbfLHgHL4SA5UzQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsdom@24.1.0: + resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonpath@1.1.1: + resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.29.0: + resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@13.2.2: + resolution: {integrity: sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + listr2@5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.1: + resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-app@2.5.0: + resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + metric-lcs@0.1.2: + resolution: {integrity: sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mock-property@1.1.0: + resolution: {integrity: sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==} + engines: {node: '>= 0.4'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nodemon@3.1.7: + resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} + engines: {node: '>=10'} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-author@2.0.0: + resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==} + engines: {node: '>=0.10.0'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-svg-path@0.1.2: + resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pixi.js@8.2.6: + resolution: {integrity: sha512-CNfr7CmjIEWJ06e3TBrXBKFpcTPMGUaFdtP4RlMOgNOTkDD6+Bhm728I/EkGAo2vsOVO1YwNFsuORQyD3MngZg==} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + playwright-core@1.46.1: + resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.46.1: + resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} + engines: {node: '>=18'} + hasBin: true + + plur@4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + + pnpm@9.0.0: + resolution: {integrity: sha512-tBBnB8ciWxdIthWVlTzL6/+XtUrQXQAqo2NfYzucU81mb3zpuLxEcE8foEi5pJtVNxqy2enWZ9Hv4u8VFLzVEw==} + engines: {node: '>=18.12'} + hasBin: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier-package-json@2.8.0: + resolution: {integrity: sha512-WxtodH/wWavfw3MR7yK/GrS4pASEQ+iSTkdtSxPJWvqzG55ir5nvbLt9rw5AOiEcqqPCRM92WCtR1rk3TG3JSQ==} + hasBin: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-quick@4.0.0: + resolution: {integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-reconciler@0.31.0: + resolution: {integrity: sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^19.0.0 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + + resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + riteway@8.0.0-RC4: + resolution: {integrity: sha512-zUqwi4jR1iVgVAFLRuBerhHilvGxHjxibW3wHdMh8EaYFAWywmmq0kaF9diibnJ3wLue/TVEqX6NtS/ePj/eGw==} + hasBin: true + + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safaridriver@0.1.2: + resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + + seroval-plugins@1.5.2: + resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.2: + resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + engines: {node: '>=10'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + solid-js@1.9.12: + resolution: {integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==} + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-order@1.1.2: + resolution: {integrity: sha512-Q8tOrwB1TSv9fNUXym9st3TZJODtmcOIi2JWCkVNQPrRg17KPwlpwweTEb7pMwUIFMTAgx2/JsQQXEPFzYQj3A==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spacetrim@0.11.59: + resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + static-eval@2.0.2: + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + stylelint-config-recommended@14.0.1: + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-config-standard@36.0.0: + resolution: {integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint@16.2.1: + resolution: {integrity: sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==} + engines: {node: '>=18.12.0'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tape@5.9.0: + resolution: {integrity: sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA==} + hasBin: true + + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedoc@0.28.9: + resolution: {integrity: sha512-aw45vwtwOl3QkUAmWCnLV9QW1xY+FSX2zzlit4MAfE99wX+Jij4ycnpbAWgBXsRrxmfs9LaYktg/eX5Bpthd3g==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + + undici@7.22.0: + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + engines: {node: '>=20.18.1'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + userhome@1.0.1: + resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} + engines: {node: '>= 0.8.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-checker@0.12.0: + resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==} + engines: {node: '>=16.11'} + peerDependencies: + '@biomejs/biome': '>=1.7' + eslint: '>=9.39.1' + meow: ^13.2.0 + optionator: ^0.9.4 + oxlint: '>=1' + stylelint: '>=16' + typescript: '*' + vite: '>=5.4.21' + vls: '*' + vti: '*' + vue-tsc: ~2.2.10 || ^3.0.0 + peerDependenciesMeta: + '@biomejs/biome': + optional: true + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + oxlint: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite-plugin-solid@2.11.0: + resolution: {integrity: sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + vite@5.1.1: + resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@6.4.0: + resolution: {integrity: sha512-oLnWs9Hak/LOlKjeSpOwD6JMks8BeICEdYMJBf6P4Lac/pO9tKiv/XhXnAM7nNfSkZahjlCZu9sS50zL8fSnsw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} + engines: {node: '>=10'} + hasBin: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webdriver@9.0.8: + resolution: {integrity: sha512-UnV0ANriSTUgypGk0pz8lApeQuHt+72WEDQG5hFwkkSvggtKLyWdT7+PQkNoXvDajTmiLIqUOq8XPI/Pm71rtw==} + engines: {node: '>=18.20.0'} + + webdriverio@9.0.9: + resolution: {integrity: sha512-IwvKzhcJ9NjOL55xwj27uTTKkfxsg77dmAfqoKFSP5dQ70JzU+NgxiALEjjWQDybtt1yGIkHk7wjjxjboMU1uw==} + engines: {node: '>=18.20.0'} + peerDependencies: + puppeteer-core: ^22.3.0 + peerDependenciesMeta: + puppeteer-core: + optional: true + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + +snapshots: + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@assemblyscript/loader@0.27.30': {} + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.17.7': + dependencies: + '@babel/types': 7.17.0 + jsesc: 2.5.2 + source-map: 0.5.7 + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.23.2': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + debug: 4.4.3(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.17.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + to-fast-properties: 2.0.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@cfworker/json-schema@4.1.1': {} + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@2.4.1': {} + + '@csstools/css-tokenizer@3.0.4': {} + + '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2)': + dependencies: + postcss-selector-parser: 6.1.2 + + '@dimforge/rapier3d-compat@0.19.3': {} + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.56.0)': + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.14.0 + debug: 4.4.3(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.56.0': {} + + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@gerrit0/mini-shiki@3.23.0': + dependencies: + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3(supports-color@5.5.0) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lit-labs/observers@2.1.0': + dependencies: + '@lit/reactive-element': 2.1.2 + + '@lit-labs/ssr-dom-shim@1.5.1': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + + '@ljharb/resumer@0.1.3': + dependencies: + '@ljharb/through': 2.3.14 + call-bind: 1.0.8 + + '@ljharb/through@2.3.14': + dependencies: + call-bind: 1.0.8 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pixi/colord@2.9.6': {} + + '@pixi/react@8.0.0-beta.25(@types/react@19.0.0)(pixi.js@8.2.6)(react@19.0.0)': + dependencies: + its-fine: 1.2.5(@types/react@19.0.0)(react@19.0.0) + pixi.js: 8.2.6 + react: 19.0.0 + react-reconciler: 0.31.0(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.2': {} + + '@polka/url@1.0.0-next.29': {} + + '@promptbook/utils@0.69.5': + dependencies: + spacetrim: 0.11.59 + + '@puppeteer/browsers@2.13.0': + dependencies: + debug: 4.4.3(supports-color@5.5.0) + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.4 + tar-fs: 3.1.1 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@rollup/rollup-android-arm-eabi@4.59.0': + optional: true + + '@rollup/rollup-android-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-x64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - /@rollup/rollup-linux-x64-gnu@4.59.0: - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - /@rollup/rollup-linux-x64-musl@4.59.0: - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - /@rollup/rollup-openbsd-x64@4.59.0: - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - /@rollup/rollup-openharmony-arm64@4.59.0: - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} - cpu: [arm64] - os: [openharmony] - requiresBuild: true - dev: true + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - /@rollup/rollup-win32-arm64-msvc@4.59.0: - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - /@rollup/rollup-win32-ia32-msvc@4.59.0: - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - /@rollup/rollup-win32-x64-gnu@4.59.0: - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - /@rollup/rollup-win32-x64-msvc@4.59.0: - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - /@shikijs/engine-oniguruma@3.23.0: - resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + '@shikijs/engine-oniguruma@3.23.0': dependencies: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - dev: true - /@shikijs/langs@3.23.0: - resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + '@shikijs/langs@3.23.0': dependencies: '@shikijs/types': 3.23.0 - dev: true - /@shikijs/themes@3.23.0: - resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + '@shikijs/themes@3.23.0': dependencies: '@shikijs/types': 3.23.0 - dev: true - /@shikijs/types@3.23.0: - resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - dev: true - /@shikijs/vscode-textmate@10.0.2: - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - dev: true + '@shikijs/vscode-textmate@10.0.2': {} - /@sinclair/typebox@0.27.10: - resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - dev: true + '@sinclair/typebox@0.27.10': {} - /@spectrum-web-components/action-button@1.7.0: - resolution: {integrity: sha512-BPC574O86P/ipvwAgQscf+qsc1kzCqtL+X7sCFCn15prRJaI4jE7Qpm8xMRJFMC6scw66fhbx+GEwqqyRKQ10Q==} + '@spectrum-web-components/action-button@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/button': 1.7.0 '@spectrum-web-components/icon': 1.7.0 '@spectrum-web-components/icons-ui': 1.7.0 '@spectrum-web-components/shared': 1.7.0 - dev: false - /@spectrum-web-components/action-group@1.7.0: - resolution: {integrity: sha512-b0TFywEdIKfQ4fOnO1edwOyRLPHl2Ilq6rsT0NQJlpmrRCk192VOtvWODv5O2WfSvfLAOpW6rO79DT/IS+P/ig==} + '@spectrum-web-components/action-group@1.7.0': dependencies: '@lit-labs/observers': 2.1.0 '@spectrum-web-components/action-button': 1.7.0 '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/icons-workflow': 1.7.0 '@spectrum-web-components/reactive-controllers': 1.7.0 - dev: false - /@spectrum-web-components/asset@1.7.0: - resolution: {integrity: sha512-+H0kHAGbvJT6KWCLd0dIX1Fek9R2i2VwoRr09XdmwzG/X220vr5C2pf9zjPmPmDOoOal4XjlK9VO13x9wKlPSA==} + '@spectrum-web-components/asset@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 - dev: false - /@spectrum-web-components/base@1.7.0: - resolution: {integrity: sha512-KYp/mvvFh7swi9x9/5Z+tYlA0Vd/Jc0BEPYEjphN2hpzh4uZNuFilMZWNYM7zDJvjZ/ZMIZzz4/Ugv6vIentZA==} + '@spectrum-web-components/base@1.7.0': dependencies: lit: 3.3.1 - dev: false - /@spectrum-web-components/button@1.7.0: - resolution: {integrity: sha512-JMyJShFhCNVc/WXhsrlHswoz0B+w0R9JU00Spw8kgorQOZPwgIUWcNon/ZmA9X2ednsEympZIFsFLgqpch7whw==} + '@spectrum-web-components/button@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/clear-button': 1.7.0 @@ -1784,10 +5232,8 @@ packages: '@spectrum-web-components/progress-circle': 1.7.0 '@spectrum-web-components/reactive-controllers': 1.7.0 '@spectrum-web-components/shared': 1.7.0 - dev: false - /@spectrum-web-components/card@1.7.0: - resolution: {integrity: sha512-bZMUM0f10WmQoPHkIdl2oZYFpH2bEAKHh7EejFs6BlPJjEV/KC7s/G9l46jvX3nImW5zpd67vpr3IWjyMuGzKw==} + '@spectrum-web-components/card@1.7.0': dependencies: '@spectrum-web-components/asset': 1.7.0 '@spectrum-web-components/base': 1.7.0 @@ -1797,65 +5243,47 @@ packages: '@spectrum-web-components/popover': 1.7.0 '@spectrum-web-components/shared': 1.7.0 '@spectrum-web-components/styles': 1.7.0 - dev: false - /@spectrum-web-components/checkbox@1.7.0: - resolution: {integrity: sha512-vowZXD8cmj5cmgozZahjQaxFB7+FohgXmKUS2Dh/PGU6Upo5m3jnkWZBngP6c7DQyVOXlqzgZc6kxO3G+OvWxg==} + '@spectrum-web-components/checkbox@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/icon': 1.7.0 '@spectrum-web-components/icons-ui': 1.7.0 '@spectrum-web-components/shared': 1.7.0 - dev: false - /@spectrum-web-components/clear-button@1.7.0: - resolution: {integrity: sha512-eyfV9Rs5bJOa/+HSIcJIsvuRLpAIHHeL1gy1rfNFKNb7dvR2Egm12+N4ZsSx1DlOmWppPFVJp27udyZ+0PPgeQ==} + '@spectrum-web-components/clear-button@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 - dev: false - /@spectrum-web-components/close-button@1.7.0: - resolution: {integrity: sha512-wvaI4HC75Gum+Xdzk+JzqleJRykiiZjU/4potkVgbqP8qYrGF+IEdFJRfH3t4ktthJbw54i0AsFE+iS5j6y6Cw==} + '@spectrum-web-components/close-button@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 - dev: false - /@spectrum-web-components/divider@1.7.0: - resolution: {integrity: sha512-2LLw6WPCnz8uNf++LtTfxQW69Be6+BsY2wtJJQhpih0yXSW1F7WVoIzkQZOzrVq1OV4OHx54MhdgHZ5vW5y3LA==} + '@spectrum-web-components/divider@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 - dev: false - /@spectrum-web-components/icon@1.7.0: - resolution: {integrity: sha512-VLM2oIpOrak/u65gUMFax5FRkFPxm1C0ZRPnAAX3EcjJhgcyjTAO6S6I/rE3OB4hicowBWXUS3ImngM+puetUQ==} + '@spectrum-web-components/icon@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/iconset': 1.7.0 - dev: false - /@spectrum-web-components/icons-ui@1.7.0: - resolution: {integrity: sha512-lIWU5n+WtfMzpAmesi4BqMSqqGIjz95kqK98pv9dHHU5AryMpZdo+m767PwomnJdoRu04Z++kNNKvY+X5cQZ/w==} + '@spectrum-web-components/icons-ui@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/icon': 1.7.0 '@spectrum-web-components/iconset': 1.7.0 - dev: false - /@spectrum-web-components/icons-workflow@1.7.0: - resolution: {integrity: sha512-2zCoRqxPEe5h1TLx7SVWucfDCZIZwbQ+esgle8vZr0Zr2902jrn3UyiTJYBtyyShGyZNFTWNvablwT/ZoEU8Vw==} + '@spectrum-web-components/icons-workflow@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/icon': 1.7.0 - dev: false - /@spectrum-web-components/iconset@1.7.0: - resolution: {integrity: sha512-KLUpXdFtAe12qwtEGrDI6UK406FLCbsKCbggK8z6hw8vIMDe9sVYWC6D0KInPx1ZSLwuzpT7TF2uCU2aKgD5ow==} + '@spectrum-web-components/iconset@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 - dev: false - /@spectrum-web-components/overlay@1.7.0: - resolution: {integrity: sha512-U2hcp6Z1X4sleod0TYb0Q2FCmXwcI/vjYu9yr/a7huUV5dAnE0DYBx1wz1/sM/cJru8m51zyNzCXid4f22WyJA==} + '@spectrum-web-components/overlay@1.7.0': dependencies: '@floating-ui/dom': 1.7.5 '@floating-ui/utils': 0.2.10 @@ -1865,64 +5293,42 @@ packages: '@spectrum-web-components/shared': 1.7.0 '@spectrum-web-components/theme': 1.7.0 focus-trap: 7.8.0 - dev: false - /@spectrum-web-components/popover@1.7.0: - resolution: {integrity: sha512-SPZbhIszCAp/P3dqGkfjICnt4i/gBLi9zzsyUoL08KNBsELI89k6b3vQrtjuKTKhERcJ+JKdzQgMCAjyR6g+gg==} + '@spectrum-web-components/popover@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/overlay': 1.7.0 - dev: false - /@spectrum-web-components/progress-circle@1.7.0: - resolution: {integrity: sha512-xz0cRnRJcGCAfT519MrBZVVetMrhwlhYTzEeaWuDlgw+5Oe3gRbNcYNwKcmxXZ2q+GWDYMvGK3jQ9wtpIsVeOQ==} + '@spectrum-web-components/progress-circle@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/shared': 1.7.0 - dev: false - /@spectrum-web-components/reactive-controllers@1.7.0: - resolution: {integrity: sha512-BYrYuRGw2OaKnj5kxlfvHvDrEQMtwBl8zpTBHKJZrvnPHJFYANtcjhylvzIoDQCcRihekm8GDQIOqiL8I0BKhA==} + '@spectrum-web-components/reactive-controllers@1.7.0': dependencies: '@spectrum-web-components/progress-circle': 1.7.0 colorjs.io: 0.5.2 lit: 3.3.1 - dev: false - /@spectrum-web-components/shared@1.7.0: - resolution: {integrity: sha512-7bjmYer5VuENWZgo9u+eHLtn+4ZTK1z76xamYgHpZZZXZu6S29TBtxeg0NbF0nZWqAxpJx4ICNPZ3ZTz8kW52A==} + '@spectrum-web-components/shared@1.7.0': dependencies: '@lit-labs/observers': 2.1.0 '@spectrum-web-components/base': 1.7.0 focus-visible: 5.2.1 - dev: false - /@spectrum-web-components/styles@1.7.0: - resolution: {integrity: sha512-lWA+SB8qPZAtW6lUmAGYXSwWxmUM7UBsxZId2KWah/xDHj6Klh3bSm5JoDkMxK2E4YRd/2QYK/VDMdvk/HmNfw==} + '@spectrum-web-components/styles@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 lit: 3.3.1 - dev: false - /@spectrum-web-components/theme@1.7.0: - resolution: {integrity: sha512-UXstgZwl7gDJCKJ7MoWSFt9iCDdf8d8SFb+HMQy9jW58/lUIpmrj46A6EX84Pk52K2F3VGF8OAEm3Pjl37VmsQ==} + '@spectrum-web-components/theme@1.7.0': dependencies: '@spectrum-web-components/base': 1.7.0 '@spectrum-web-components/styles': 1.7.0 - dev: false - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - dev: true + '@tootallnate/quickjs-emscripten@0.23.0': {} - /@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.2.5): - resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} - peerDependencies: - '@vue/compiler-sfc': 3.x - prettier: 2.x - 3.x - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.2.5)': dependencies: '@babel/generator': 7.17.7 '@babel/parser': 7.29.0 @@ -1933,160 +5339,95 @@ packages: prettier: 3.2.5 transitivePeerDependencies: - supports-color - dev: true - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 - dev: true - /@types/babel__generator@7.27.0: - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@types/babel__generator@7.27.0': dependencies: '@babel/types': 7.29.0 - dev: true - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 - dev: true - /@types/babel__traverse@7.28.0: - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/babel__traverse@7.28.0': dependencies: '@babel/types': 7.29.0 - dev: true - /@types/css-font-loading-module@0.0.12: - resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==} - dev: false + '@types/css-font-loading-module@0.0.12': {} - /@types/earcut@2.1.4: - resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} - dev: false + '@types/earcut@2.1.4': {} - /@types/eslint@8.56.12: - resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + '@types/eslint@8.56.12': dependencies: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - dev: true - /@types/estree@1.0.8: - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: true + '@types/estree@1.0.8': {} - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 - dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json5@0.0.29': {} - /@types/jsonpath@0.2.4: - resolution: {integrity: sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==} - dev: true + '@types/jsonpath@0.2.4': {} - /@types/node@20.19.35: - resolution: {integrity: sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==} + '@types/node@20.19.35': dependencies: undici-types: 6.21.0 - dev: true - /@types/node@25.6.0: - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@25.6.0': dependencies: undici-types: 7.19.2 - dev: true - /@types/parse-author@2.0.3: - resolution: {integrity: sha512-pgRW2K/GVQoogylrGJXDl7PBLW9A6T4OOc9Hy9MLT5f7vgufK2GQ8FcfAbjFHR5HjcN9ByzuCczAORk49REqoA==} - dev: true + '@types/parse-author@2.0.3': {} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: true + '@types/parse-json@4.0.2': {} - /@types/react-dom@19.0.0: - resolution: {integrity: sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w==} + '@types/react-dom@19.0.0': dependencies: '@types/react': 19.0.0 - dev: true - /@types/react-reconciler@0.28.9(@types/react@19.0.0): - resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} - peerDependencies: - '@types/react': '*' + '@types/react-reconciler@0.28.9(@types/react@19.0.0)': dependencies: '@types/react': 19.0.0 - dev: false - /@types/react@19.0.0: - resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==} + '@types/react@19.0.0': dependencies: csstype: 3.2.3 - /@types/semver@7.7.1: - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - dev: true + '@types/semver@7.7.1': {} - /@types/sinonjs__fake-timers@8.1.5: - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - dev: true + '@types/sinonjs__fake-timers@8.1.5': {} - /@types/trusted-types@2.0.7: - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/trusted-types@2.0.7': {} - /@types/unist@3.0.3: - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - dev: true + '@types/unist@3.0.3': {} - /@types/uuid@10.0.0: - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - dev: true + '@types/uuid@10.0.0': {} - /@types/which@2.0.2: - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} - dev: true + '@types/which@2.0.2': {} - /@types/ws@8.18.1: - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/ws@8.18.1': dependencies: '@types/node': 25.6.0 - dev: true - /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - requiresBuild: true + '@types/yauzl@2.10.3': dependencies: '@types/node': 25.6.0 - dev: true optional: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) @@ -2104,17 +5445,8 @@ packages: typescript: 5.8.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 @@ -2125,25 +5457,13 @@ packages: typescript: 5.8.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.8.3) @@ -2153,21 +5473,10 @@ packages: typescript: 5.8.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.21.0': {} - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -2180,13 +5489,8 @@ packages: typescript: 5.8.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.8.3): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.56.0) '@types/json-schema': 7.0.15 @@ -2199,25 +5503,15 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.3.0: - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - dev: true + '@ungap/structured-clone@1.3.0': {} - /@vitejs/plugin-react@4.3.0(vite@5.1.1): - resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 + '@vitejs/plugin-react@4.3.0(vite@5.1.1)': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -2227,44 +5521,16 @@ packages: vite: 5.1.1(@types/node@25.6.0) transitivePeerDependencies: - supports-color - dev: true - /@vitest/browser@1.6.0(playwright@1.46.1)(vitest@1.6.0): - resolution: {integrity: sha512-3Wpp9h1hf++rRVPvoXevkdHybLhJVn7MwIMKMIh08tVaoDMmT6fnNhbP222Z48V9PptpYeA5zvH9Ct/ZcaAzmQ==} - peerDependencies: - playwright: '*' - safaridriver: '*' - vitest: 1.6.0 - webdriverio: '*' - peerDependenciesMeta: - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + '@vitest/browser@1.6.0(playwright@1.46.1)(vitest@1.6.0)': dependencies: '@vitest/utils': 1.6.0 magic-string: 0.30.21 playwright: 1.46.1 sirv: 2.0.4 vitest: 1.6.0(@types/node@25.6.0)(@vitest/browser@1.6.0) - dev: true - /@vitest/browser@1.6.0(playwright@1.46.1)(vitest@1.6.0)(webdriverio@9.0.9): - resolution: {integrity: sha512-3Wpp9h1hf++rRVPvoXevkdHybLhJVn7MwIMKMIh08tVaoDMmT6fnNhbP222Z48V9PptpYeA5zvH9Ct/ZcaAzmQ==} - peerDependencies: - playwright: '*' - safaridriver: '*' - vitest: 1.6.0 - webdriverio: '*' - peerDependenciesMeta: - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + '@vitest/browser@1.6.0(playwright@1.46.1)(vitest@1.6.0)(webdriverio@9.0.9)': dependencies: '@vitest/utils': 1.6.0 magic-string: 0.30.21 @@ -2272,50 +5538,37 @@ packages: sirv: 2.0.4 vitest: 1.6.0(@types/node@25.6.0)(@vitest/browser@1.6.0)(jsdom@24.1.0) webdriverio: 9.0.9 - dev: true - /@vitest/expect@1.6.0: - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@1.6.0': dependencies: '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 chai: 4.5.0 - dev: true - /@vitest/runner@1.6.0: - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - dev: true - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@1.6.0': dependencies: magic-string: 0.30.21 pathe: 1.1.2 pretty-format: 29.7.0 - dev: true - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 - dev: true - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 - dev: true - /@wdio/config@9.0.8: - resolution: {integrity: sha512-37L+hd+A1Nyehd/pgfTrLC6w+Ngbu0CIoFh9Vv6v8Cgu5Hih0TLofvlg+J1BNbcTd5eQ2tFKZBDeFMhQaIiTpg==} - engines: {node: '>=18.20.0'} + '@wdio/config@9.0.8': dependencies: '@wdio/logger': 9.0.8 '@wdio/types': 9.0.8 @@ -2329,49 +5582,32 @@ packages: - bare-buffer - react-native-b4a - supports-color - dev: true - /@wdio/logger@8.38.0: - resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} - engines: {node: ^16.13 || >=18} + '@wdio/logger@8.38.0': dependencies: chalk: 5.6.2 loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 strip-ansi: 7.2.0 - dev: true - /@wdio/logger@9.0.8: - resolution: {integrity: sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==} - engines: {node: '>=18.20.0'} + '@wdio/logger@9.0.8': dependencies: chalk: 5.6.2 loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 strip-ansi: 7.2.0 - dev: true - /@wdio/protocols@9.0.8: - resolution: {integrity: sha512-xRH54byFf623/w/KW62xkf/C2mGyigSfMm+UT3tNEAd5ZA9X2VAWQWQBPzdcrsck7Fxk4zlQX8Kb34RSs7Cy4Q==} - dev: true + '@wdio/protocols@9.0.8': {} - /@wdio/repl@9.0.8: - resolution: {integrity: sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==} - engines: {node: '>=18.20.0'} + '@wdio/repl@9.0.8': dependencies: '@types/node': 20.19.35 - dev: true - /@wdio/types@9.0.8: - resolution: {integrity: sha512-pmz2iRWddTanrv8JC7v3wUGm17KRv2WyyJhQfklMSANn9V1ep6pw1RJG2WJnKq4NojMvH1nVv1sMZxXrYPhpYw==} - engines: {node: '>=18.20.0'} + '@wdio/types@9.0.8': dependencies: '@types/node': 20.19.35 - dev: true - /@wdio/utils@9.0.8: - resolution: {integrity: sha512-p3EgOdkhCvMxJFd3WTtSChqYFQu2mz69/5tOsljDaL+4QYwnRR7O8M9wFsL3/9XMVcHdnC4Ija2VRxQ/lb+hHQ==} - engines: {node: '>=18.20.0'} + '@wdio/utils@9.0.8': dependencies: '@puppeteer/browsers': 2.13.0 '@wdio/logger': 9.0.8 @@ -2391,132 +5627,74 @@ packages: - bare-buffer - react-native-b4a - supports-color - dev: true - /@webgpu/types@0.1.61: - resolution: {integrity: sha512-w2HbBvH+qO19SB5pJOJFKs533CdZqxl3fcGonqL321VHkW7W/iBo6H8bjDy6pr/+pbMwIu5dnuaAxH7NxBqUrQ==} + '@webgpu/types@0.1.61': {} - /@xmldom/xmldom@0.8.11: - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} - engines: {node: '>=10.0.0'} - dev: false + '@xmldom/xmldom@0.8.11': {} - /@zip.js/zip.js@2.8.21: - resolution: {integrity: sha512-fkyzXISE3IMrstDO1AgPkJCx14MYHP/suIGiAovEYEuBjq3mffsuL6aMV7ohOSjW4rXtuACuUfpA3GtITgdtYg==} - engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} - dev: true + '@zip.js/zip.js@2.8.21': {} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - dev: true - /acorn-jsx@5.3.2(acorn@8.16.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 - dev: true - /acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} + acorn-walk@8.3.5: dependencies: acorn: 8.16.0 - dev: true - /acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.16.0: {} - /agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - dev: true + agent-base@7.1.4: {} - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.2.2: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.3: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} + archiver-utils@5.0.2: dependencies: glob: 10.3.10 graceful-fs: 4.2.11 @@ -2525,11 +5703,8 @@ packages: lodash: 4.17.23 normalize-path: 3.0.0 readable-stream: 4.7.0 - dev: true - /archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} + archiver@7.0.1: dependencies: archiver-utils: 5.0.2 async: 3.2.6 @@ -2541,28 +5716,17 @@ packages: transitivePeerDependencies: - bare-abort-controller - react-native-b4a - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - dev: true + aria-query@5.3.2: {} - /array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 - dev: true - /array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.9: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -2572,27 +5736,18 @@ packages: get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.every@1.1.7: - resolution: {integrity: sha512-BIP72rKvrKd08ptbetLb4qvrlGjkv30yOKgKcTtOIbHyQt3shr/jyOzdApiCOh3LPYrpJo5M6i0zmVldOF2pUw==} - engines: {node: '>= 0.4'} + array.prototype.every@1.1.7: dependencies: call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.1 es-object-atoms: 1.1.1 is-string: 1.1.1 - dev: true - /array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -2601,31 +5756,22 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 - dev: true - /array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 - dev: true - /array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 - dev: true - /arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 @@ -2634,71 +5780,35 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - dev: true - /assemblyscript@0.27.30: - resolution: {integrity: sha512-tSlwbLEDM1X+w/6/Y2psc3sEg9/7r+m7xv44G6FI2G/w1MNnnulLxcPo7FN0kVIBoD/oxCiRFGaQAanFY0gPhA==} - engines: {node: '>=16', npm: '>=7'} - hasBin: true + assemblyscript@0.27.30: dependencies: binaryen: 116.0.0-nightly.20240114 long: 5.3.2 - dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} + ast-types@0.13.4: dependencies: tslib: 2.8.1 - dev: true - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - /async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - dev: true + astral-regex@2.0.0: {} - /async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - dev: true + async-function@1.0.0: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + async@3.2.6: {} - /author-regex@1.0.0: - resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==} - engines: {node: '>=0.8'} - dev: true + asynckit@0.4.0: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + author-regex@1.0.0: {} + + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - dev: true - /b4a@1.8.0: - resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - dev: true + b4a@1.8.0: {} - /babel-plugin-jsx-dom-expressions@0.40.6(@babel/core@7.29.0): - resolution: {integrity: sha512-v3P1MW46Lm7VMpAkq0QfyzLWWkC8fh+0aE5Km4msIgDx5kjenHU0pF2s+4/NH8CQn/kla6+Hvws+2AF7bfV5qQ==} - peerDependencies: - '@babel/core': ^7.20.12 + babel-plugin-jsx-dom-expressions@0.40.6(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 @@ -2706,48 +5816,20 @@ packages: '@babel/types': 7.29.0 html-entities: 2.3.3 parse5: 7.3.0 - dev: true - /babel-preset-solid@1.9.12(@babel/core@7.29.0)(solid-js@1.9.12): - resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} - peerDependencies: - '@babel/core': ^7.0.0 - solid-js: ^1.9.12 - peerDependenciesMeta: - solid-js: - optional: true + babel-preset-solid@1.9.12(@babel/core@7.29.0)(solid-js@1.9.12): dependencies: '@babel/core': 7.29.0 babel-plugin-jsx-dom-expressions: 0.40.6(@babel/core@7.29.0) solid-js: 1.9.12 - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /balanced-match@2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - dev: true + balanced-match@2.0.0: {} - /bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - dev: true + bare-events@2.8.2: {} - /bare-fs@4.5.5: - resolution: {integrity: sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==} - engines: {bare: '>=1.16.0'} - requiresBuild: true - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true + bare-fs@4.5.5: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 @@ -2757,32 +5839,17 @@ packages: transitivePeerDependencies: - bare-abort-controller - react-native-b4a - dev: true optional: true - /bare-os@3.7.0: - resolution: {integrity: sha512-64Rcwj8qlnTZU8Ps6JJEdSmxBEUGgI7g8l+lMtsJLl4IsfTcHMTfJ188u2iGV6P6YPRZrtv72B2kjn+hp+Yv3g==} - engines: {bare: '>=1.14.0'} - dev: true + bare-os@3.7.0: optional: true - /bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + bare-path@3.0.0: dependencies: bare-os: 3.7.0 - dev: true optional: true - /bare-stream@2.8.0(bare-events@2.8.2): - resolution: {integrity: sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true + bare-stream@2.8.0(bare-events@2.8.2): dependencies: bare-events: 2.8.2 streamx: 2.23.0 @@ -2790,136 +5857,79 @@ packages: transitivePeerDependencies: - bare-abort-controller - react-native-b4a - dev: true optional: true - /bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + bare-url@2.3.2: dependencies: bare-path: 3.0.0 - dev: true optional: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-js@1.5.1: {} - /baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true + baseline-browser-mapping@2.10.0: {} - /basic-ftp@5.2.0: - resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} - engines: {node: '>=10.0.0'} - dev: true + basic-ftp@5.2.0: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.3.0: {} - /binaryen@116.0.0-nightly.20240114: - resolution: {integrity: sha512-0GZrojJnuhoe+hiwji7QFaL3tBlJoA+KFUN7ouYSDGZLSo9CKM8swQX8n/UcbR0d1VuZKU+nhogNzv423JEu5A==} - hasBin: true - dev: true + binaryen@116.0.0-nightly.20240114: {} - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - dev: true - /browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.10.0 caniuse-lite: 1.0.30001774 electron-to-chromium: 1.5.302 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) - dev: true - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true + buffer-crc32@0.2.13: {} - /buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - dev: true + buffer-crc32@1.0.0: {} - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - dev: true - /call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} + call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 get-intrinsic: 1.3.0 set-function-length: 1.2.2 - dev: true - /call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /caniuse-lite@1.0.30001774: - resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} - dev: true + caniuse-lite@1.0.30001774: {} - /chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -2928,43 +5938,27 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.1.0 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.2.0: {} - /chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.6.2: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 css-select: 5.2.2 @@ -2972,11 +5966,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 - dev: true - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -2985,11 +5976,8 @@ packages: htmlparser2: 8.0.2 parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 - dev: true - /cheerio@1.2.0: - resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} - engines: {node: '>=20.18.1'} + cheerio@1.2.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -3002,11 +5990,8 @@ packages: parse5-parser-stream: 7.1.2 undici: 7.22.0 whatwg-mimetype: 4.0.0 - dev: true - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.3 @@ -3017,340 +6002,191 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 - dev: true - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + clean-stack@2.2.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} + cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 string-width: 4.2.3 - dev: true - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-truncate@3.1.0: dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - dev: true + colord@2.9.3: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /colorjs.io@0.5.2: - resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} - dev: false + colorjs.io@0.5.2: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: true + commander@10.0.1: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true + commander@9.5.0: {} - /compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} + compress-commons@6.0.2: dependencies: crc-32: 1.2.2 crc32-stream: 6.0.0 is-stream: 2.0.1 normalize-path: 3.0.0 readable-stream: 4.7.0 - dev: true - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - dev: true + confbox@0.1.8: {} - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: true + confusing-browser-globals@1.0.11: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true - /cosmiconfig@9.0.0(typescript@5.8.3): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 typescript: 5.8.3 - dev: true - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: true + crc-32@1.2.2: {} - /crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} + crc32-stream@6.0.0: dependencies: crc-32: 1.2.2 readable-stream: 4.7.0 - dev: true - /cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /css-functions-list@3.3.3: - resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} - engines: {node: '>=12'} - dev: true + css-functions-list@3.3.3: {} - /css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-select@5.2.2: dependencies: boolbase: 1.0.0 css-what: 6.2.2 domhandler: 5.0.3 domutils: 3.2.2 nth-check: 2.1.1 - dev: true - /css-shorthand-properties@1.1.2: - resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} - dev: true + css-shorthand-properties@1.1.2: {} - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.2.1 - dev: true - /css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} - dev: true + css-value@0.0.1: {} - /css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - dev: true + css-what@6.2.2: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true + cssesc@3.0.0: {} - /cssstyle@4.6.0: - resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} - engines: {node: '>=18'} + cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 - dev: true - /csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + csstype@3.2.3: {} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + data-uri-to-buffer@4.0.1: {} - /data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - dev: true + data-uri-to-buffer@6.0.2: {} - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - dev: true - /data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - dev: true - /data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - dev: true - /data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.4.3(supports-color@5.5.0): - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 supports-color: 5.5.0 - dev: true - /decamelize@6.0.1: - resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + decamelize@6.0.1: {} - /decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - dev: true + decimal.js@10.6.0: {} - /deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} + deep-eql@4.1.4: dependencies: type-detect: 4.1.0 - dev: true - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 @@ -3370,141 +6206,85 @@ packages: which-boxed-primitive: 1.1.1 which-collection: 1.0.2 which-typed-array: 1.1.20 - dev: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-is@0.1.4: {} - /deepmerge-ts@7.1.5: - resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} - engines: {node: '>=16.0.0'} - dev: true + deepmerge-ts@7.1.5: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - dev: true - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - dev: true + defined@1.0.1: {} - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + degenerator@5.0.1: dependencies: ast-types: 0.13.4 escodegen: 2.1.0 esprima: 4.0.1 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + delayed-stream@1.0.0: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /dotignore@0.1.2: - resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} - hasBin: true + dotignore@0.1.2: dependencies: minimatch: 3.1.5 - dev: true - /dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - dev: true - /earcut@2.2.4: - resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} - dev: false + earcut@2.2.4: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} - engines: {node: '>=14.0.0'} + edge-paths@3.0.5: dependencies: '@types/which': 2.0.2 which: 2.0.2 - dev: true - /edgedriver@5.6.1: - resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} - hasBin: true - requiresBuild: true + edgedriver@5.6.1: dependencies: '@wdio/logger': 8.38.0 '@zip.js/zip.js': 2.8.21 @@ -3513,62 +6293,35 @@ packages: fast-xml-parser: 4.5.4 node-fetch: 3.3.2 which: 4.0.0 - dev: true - /electron-to-chromium@1.5.302: - resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} - dev: true + electron-to-chromium@1.5.302: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /encoding-sniffer@0.2.1: - resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + encoding-sniffer@0.2.1: dependencies: iconv-lite: 0.6.3 whatwg-encoding: 3.1.1 - dev: true - /end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + end-of-stream@1.4.5: dependencies: once: 1.4.0 - dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - dev: true + entities@6.0.1: {} - /entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - dev: true + entities@7.0.1: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} - engines: {node: '>= 0.4'} + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -3624,20 +6377,12 @@ packages: typed-array-length: 1.0.7 unbox-primitive: 1.1.0 which-typed-array: 1.1.20 - dev: true - /es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - dev: true + es-define-property@1.0.1: {} - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.8 get-intrinsic: 1.3.0 @@ -3648,46 +6393,29 @@ packages: is-string: 1.1.1 isarray: 2.0.5 stop-iteration-iterator: 1.1.0 - dev: true - /es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 - dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 '@esbuild/android-arm': 0.19.12 @@ -3712,13 +6440,8 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: true - /esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 '@esbuild/android-arm': 0.25.12 @@ -3746,27 +6469,14 @@ packages: '@esbuild/win32-arm64': 0.25.12 '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - dev: true - /escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - dev: true + escalade@3.2.0: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true + escodegen@1.14.3: dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -3774,26 +6484,16 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 - dev: false - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true - /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.56.0): - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.56.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.56.0 @@ -3801,35 +6501,20 @@ packages: object.assign: 4.1.7 object.entries: 1.1.9 semver: 6.3.1 - dev: true - /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): - resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0 - '@typescript-eslint/parser': ^5.0.0 || ^6.0.0 - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 + eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): dependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.8.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) eslint: 8.56.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.56.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0) - dev: true - /eslint-config-prettier@9.1.0(eslint@8.56.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.56.0): dependencies: eslint: 8.56.0 - dev: true - /eslint-formatter-pretty@5.0.0: - resolution: {integrity: sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==} - engines: {node: '>=14.16'} + eslint-formatter-pretty@5.0.0: dependencies: '@types/eslint': 8.56.12 ansi-escapes: 4.3.2 @@ -3839,38 +6524,16 @@ packages: plur: 4.0.0 string-width: 4.2.3 supports-hyperlinks: 2.3.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.16.1 resolve: 1.22.11 transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): dependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) debug: 3.2.7 @@ -3878,25 +6541,12 @@ packages: eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-header@3.1.1(eslint@8.56.0): - resolution: {integrity: sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==} - peerDependencies: - eslint: '>=7.7.0' + eslint-plugin-header@3.1.1(eslint@8.56.0): dependencies: eslint: 8.56.0 - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0): dependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.8.3) array-includes: 3.1.9 @@ -3921,62 +6571,32 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-notice@0.9.10(eslint@8.56.0): - resolution: {integrity: sha512-rF79EuqdJKu9hhTmwUkNeSvLmmq03m/NXq/NHwUENHbdJ0wtoyOjxZBhW4QCug8v5xYE6cGe3AWkGqSIe9KUbQ==} - peerDependencies: - eslint: '>=3.0.0' + eslint-plugin-notice@0.9.10(eslint@8.56.0): dependencies: eslint: 8.56.0 find-root: 1.1.0 lodash: 4.17.23 metric-lcs: 0.1.2 - dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5): dependencies: eslint: 8.56.0 eslint-config-prettier: 9.1.0(eslint@8.56.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.1 synckit: 0.8.8 - dev: true - /eslint-rule-docs@1.1.235: - resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} - dev: true + eslint-rule-docs@1.1.235: {} - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true + eslint@8.56.0: dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.56.0) '@eslint-community/regexpp': 4.12.2 @@ -4018,92 +6638,50 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /esm@3.2.25: - resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} - engines: {node: '>=6'} - dev: true + esm@3.2.25: {} - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@1.2.2: - resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + esprima@1.2.2: {} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} + esquery@1.7.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: false + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 - dev: true - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: true + event-target-shim@5.0.1: {} - /eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - dev: false + eventemitter3@5.0.4: {} - /events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events-universal@1.0.1: dependencies: bare-events: 2.8.2 transitivePeerDependencies: - bare-abort-controller - dev: true - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 get-stream: 6.0.1 @@ -4114,11 +6692,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.6 get-stream: 6.0.1 @@ -4129,11 +6704,8 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.6 get-stream: 8.0.1 @@ -4144,12 +6716,8 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true + extract-zip@2.0.1: dependencies: debug: 4.4.3(supports-color@5.5.0) get-stream: 5.2.0 @@ -4158,223 +6726,128 @@ packages: '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color - dev: true - /fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - dev: true + fast-deep-equal@2.0.1: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: true + fast-fifo@1.3.2: {} - /fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-levenshtein@2.0.6: {} - /fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - dev: true + fast-uri@3.1.0: {} - /fast-xml-parser@4.5.4: - resolution: {integrity: sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==} - hasBin: true + fast-xml-parser@4.5.4: dependencies: strnum: 1.1.2 - dev: true - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - dev: true + fastest-levenshtein@1.0.16: {} - /fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.20.1: dependencies: reusify: 1.1.0 - dev: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - dev: true - /fdir@6.5.0(picomatch@4.0.3): - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + fdir@6.5.0(picomatch@4.0.3): dependencies: picomatch: 4.0.3 - dev: true - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - dev: true - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true + find-root@1.1.0: {} - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 - dev: true - /flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - dev: true + flatted@3.3.3: {} - /focus-trap@7.8.0: - resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + focus-trap@7.8.0: dependencies: tabbable: 6.4.0 - dev: false - /focus-visible@5.2.1: - resolution: {integrity: sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==} - dev: false + focus-visible@5.2.1: {} - /for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + for-each@0.3.5: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - dev: true - /form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 hasown: 2.0.2 mime-types: 2.1.35 - dev: true - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - dev: true - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 universalify: 2.0.1 - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.2: optional: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -4382,17 +6855,10 @@ packages: functions-have-names: 1.2.3 hasown: 2.0.2 is-callable: 1.2.7 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /geckodriver@4.5.1: - resolution: {integrity: sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==} - engines: {node: ^16.13 || >=18 || >=20} - hasBin: true - requiresBuild: true + geckodriver@4.5.1: dependencies: '@wdio/logger': 9.0.8 '@zip.js/zip.js': 2.8.21 @@ -4407,30 +6873,16 @@ packages: - bare-buffer - react-native-b4a - supports-color - dev: true - /generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - dev: true + generator-function@2.0.1: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -4442,93 +6894,55 @@ packages: has-symbols: 1.1.0 hasown: 2.0.2 math-intrinsics: 1.1.0 - dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} - dev: true + get-port@7.1.0: {} - /get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - dev: true - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.3 - dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 - dev: true - /get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} + get-uri@6.0.5: dependencies: basic-ftp: 5.2.0 data-uri-to-buffer: 6.0.2 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.3.1 jackspeak: 2.3.6 minimatch: 9.0.9 minipass: 7.1.3 path-scurry: 1.11.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4536,47 +6950,29 @@ packages: minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - dev: true - /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + global-prefix@3.0.0: dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -4584,570 +6980,312 @@ packages: ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globjoin@0.1.4: - resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - dev: true + globjoin@0.1.4: {} - /gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - dev: true + gopd@1.2.0: {} - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + grapheme-splitter@1.0.4: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - dev: true + has-bigints@1.1.0: {} - /has-dynamic-import@2.1.1: - resolution: {integrity: sha512-DuTCn6K/RW8S27npDMumGKsjG6HE7MxzedZka5tJP+9dqfxks+UMqKBmeCijHtIhsBEZPlbMg0qMHi2nKYVtKQ==} - engines: {node: '>= 0.4'} + has-dynamic-import@2.1.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@3.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 - dev: true - /has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + has-proto@1.2.0: dependencies: dunder-proto: 1.0.1 - dev: true - /has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.1.0: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 - dev: true - /hash-wasm@4.12.0: - resolution: {integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==} - dev: false + hash-wasm@4.12.0: {} - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 - dev: true - /html-entities@2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - dev: true + html-entities@2.3.3: {} - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - dev: true + html-tags@3.3.1: {} - /htmlfy@0.2.1: - resolution: {integrity: sha512-HoomFHQ3av1uhq+7FxJTq4Ns0clAD+tGbQNrSd0WFY3UAjjUk6G3LaWEqdgmIXYkY4pexZiyZ3ykZJhQlM0J5A==} - dev: true + htmlfy@0.2.1: {} - /htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 entities: 7.0.1 - dev: true - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 entities: 4.5.0 - dev: true - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + human-signals@4.3.1: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true + ignore-by-default@1.0.1: {} - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.2: {} - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: true + immediate@3.0.6: {} - /import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - dev: true + import-meta-resolve@4.2.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 - dev: true - /ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - dev: true + ip-address@10.1.0: {} - /irregular-plurals@3.5.0: - resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} - engines: {node: '>=8'} - dev: true + irregular-plurals@3.5.0: {} - /is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} + is-arguments@1.2.0: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - dev: true - /is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + is-bigint@1.1.0: dependencies: has-bigints: 1.1.0 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - dev: true - /is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + is-data-view@1.0.2: dependencies: call-bound: 1.0.4 get-intrinsic: 1.3.0 is-typed-array: 1.1.15 - dev: true - /is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + is-date-object@1.1.0: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + is-map@2.0.3: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: true + is-plain-obj@4.1.0: {} - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-object@5.0.0: {} - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + is-potential-custom-element-name@1.0.1: {} - /is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + is-string@1.1.1: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + is-symbol@1.1.1: dependencies: call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 - dev: true - /is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.20 - dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: true + is-weakmap@2.0.2: {} - /is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + is-weakref@1.1.1: dependencies: call-bound: 1.0.4 - dev: true - /is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.4: dependencies: call-bound: 1.0.4 get-intrinsic: 1.3.0 - dev: true - /is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - dev: true + is-what@4.1.16: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - dev: true + isexe@3.1.5: {} - /ismobilejs@1.1.1: - resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} - dev: false + ismobilejs@1.1.1: {} - /its-fine@1.2.5(@types/react@19.0.0)(react@19.0.0): - resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} - peerDependencies: - react: '>=18.0' + its-fine@1.2.5(@types/react@19.0.0)(react@19.0.0): dependencies: '@types/react-reconciler': 0.28.9(@types/react@19.0.0) react: 19.0.0 transitivePeerDependencies: - '@types/react' - dev: false - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - dev: true + javascript-natural-sort@0.7.1: {} - /jolt-physics@1.0.0: - resolution: {integrity: sha512-rA7Mcb3CDqsDzr0J15P2DDftMR4d15/B6hfvvVh88Se3KFCYXGbPKGK2sJFGOpzUksRpyQhgbfLHgHL4SA5UzQ==} - dev: false + jolt-physics@1.0.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - dev: true + js-tokens@9.0.1: {} - /js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - dev: true - /jsdom@24.1.0: - resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + jsdom@24.1.0: dependencies: cssstyle: 4.6.0 data-urls: 5.0.0 @@ -5174,145 +7312,83 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - dev: true + jsesc@3.1.0: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonpath@1.1.1: - resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + jsonpath@1.1.1: dependencies: esprima: 1.2.2 static-eval: 2.0.2 underscore: 1.12.1 - dev: false - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + jszip@3.10.1: dependencies: lie: 3.3.0 pako: 1.0.11 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /known-css-properties@0.29.0: - resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} - dev: true + known-css-properties@0.29.0: {} - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: true - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + levn@0.3.0: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: false - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lie@3.3.0: dependencies: immediate: 3.0.6 - dev: true - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true + lilconfig@2.1.0: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - dev: true - /lint-staged@13.2.2: - resolution: {integrity: sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==} - engines: {node: ^14.13.1 || >=16.0.0} - hasBin: true + lint-staged@13.2.2: dependencies: chalk: 5.2.0 cli-truncate: 3.1.0 @@ -5330,16 +7406,8 @@ packages: transitivePeerDependencies: - enquirer - supports-color - dev: true - /listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + listr2@5.0.8: dependencies: cli-truncate: 2.1.0 colorette: 2.0.20 @@ -5349,152 +7417,96 @@ packages: rxjs: 7.8.2 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true - /lit-element@4.2.2: - resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 '@lit/reactive-element': 2.1.2 lit-html: 3.3.2 - /lit-html@3.3.2: - resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + lit-html@3.3.2: dependencies: '@types/trusted-types': 2.0.7 - /lit@3.3.1: - resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} + lit@3.3.1: dependencies: '@lit/reactive-element': 2.1.2 lit-element: 4.2.2 lit-html: 3.3.2 - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /local-pkg@0.5.1: - resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} - engines: {node: '>=14'} + local-pkg@0.5.1: dependencies: mlly: 1.8.0 pkg-types: 1.3.1 - dev: true - /locate-app@2.5.0: - resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} + locate-app@2.5.0: dependencies: '@promptbook/utils': 0.69.5 type-fest: 4.26.0 userhome: 1.0.1 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: true + lodash.clonedeep@4.5.0: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: true + lodash.truncate@4.4.2: {} - /lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} - dev: true + lodash.zip@4.2.0: {} - /lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - dev: true + lodash@4.17.23: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + log-update@4.0.0: dependencies: ansi-escapes: 4.3.2 cli-cursor: 3.1.0 slice-ansi: 4.0.0 wrap-ansi: 6.2.0 - dev: true - /loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} - dev: true + loglevel-plugin-prefix@0.8.4: {} - /loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - dev: true + loglevel@1.9.2: {} - /long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - dev: true + long@5.3.2: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - dev: true + lru-cache@10.4.3: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: true + lru-cache@7.18.3: {} - /lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true + lunr@2.3.9: {} - /magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - dev: true - /markdown-it@14.1.1: - resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} - hasBin: true + markdown-it@14.1.1: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -5502,133 +7514,72 @@ packages: mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 - dev: true - /math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - dev: true + math-intrinsics@1.1.0: {} - /mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - dev: true + mathml-tag-names@2.1.3: {} - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - dev: true + mdn-data@2.0.30: {} - /mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - dev: true + mdurl@2.0.0: {} - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true + memorystream@0.3.1: {} - /meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} - dev: true + meow@13.2.0: {} - /merge-anything@5.1.7: - resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} - engines: {node: '>=12.13'} + merge-anything@5.1.7: dependencies: is-what: 4.1.16 - dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /metric-lcs@0.1.2: - resolution: {integrity: sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA==} - dev: true + metric-lcs@0.1.2: {} - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 - dev: true - /minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} + minimatch@5.1.9: dependencies: brace-expansion: 2.0.2 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.2 - dev: true - /minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.1.3: {} - /mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.0: dependencies: acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 - dev: true - /mock-property@1.1.0: - resolution: {integrity: sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==} - engines: {node: '>= 0.4'} + mock-property@1.1.0: dependencies: define-data-property: 1.1.4 functions-have-names: 1.2.3 @@ -5637,74 +7588,39 @@ packages: hasown: 2.0.2 isarray: 2.0.5 object-inspect: 1.13.4 - dev: true - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true + mri@1.2.0: {} - /mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - dev: true + mrmime@2.0.1: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.11: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: true + netmask@2.0.2: {} - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true + nice-try@1.0.5: {} - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - dev: true + node-domexception@1.0.0: {} - /node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} + node-exports-info@1.6.0: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 object.entries: 1.1.9 semver: 6.3.1 - dev: true - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: true - /node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - dev: true + node-releases@2.0.27: {} - /nodemon@3.1.7: - resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} - engines: {node: '>=10'} - hasBin: true + nodemon@3.1.7: dependencies: chokidar: 3.6.0 debug: 4.4.3(supports-color@5.5.0) @@ -5716,26 +7632,17 @@ packages: supports-color: 5.5.0 touch: 3.1.1 undefsafe: 2.0.5 - dev: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.11 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true + npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 @@ -5746,61 +7653,36 @@ packages: read-pkg: 3.0.0 shell-quote: 1.8.3 string.prototype.padend: 3.1.6 - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 unicorn-magic: 0.3.0 - dev: true - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - /nwsapi@2.2.23: - resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} - dev: true + nwsapi@2.2.23: {} - /object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - dev: true + object-inspect@1.13.4: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-is@1.1.6: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + object.assign@4.1.7: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -5808,70 +7690,47 @@ packages: es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 - dev: true - /object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} + object.entries@1.1.9: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.1 es-object-atoms: 1.1.1 - dev: true - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.1 - dev: true - /object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + object.values@1.2.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + optionator@0.8.3: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -5879,11 +7738,8 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 - dev: false - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -5891,48 +7747,30 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 - dev: true - /own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@5.0.0: dependencies: yocto-queue: 1.2.2 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 @@ -5944,178 +7782,95 @@ packages: socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - dev: true - /pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 netmask: 2.0.2 - dev: true - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true + pako@1.0.11: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-author@2.0.0: - resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==} - engines: {node: '>=0.10.0'} + parse-author@2.0.0: dependencies: author-regex: 1.0.0 - dev: true - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.4 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-svg-path@0.1.2: - resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} - dev: false + parse-svg-path@0.1.2: {} - /parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 parse5: 7.3.0 - dev: true - /parse5-parser-stream@7.1.2: - resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + parse5-parser-stream@7.1.2: dependencies: parse5: 7.3.0 - dev: true - /parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@7.3.0: dependencies: entities: 6.0.1 - dev: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true + path-key@2.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.3 - dev: true - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + pathe@1.1.2: {} - /pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - dev: true + pathe@2.0.3: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true + pend@1.2.0: {} - /picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: true + picocolors@1.1.1: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picomatch@2.3.1: {} - /picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} - dev: true + picomatch@3.0.1: {} - /picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - dev: true + picomatch@4.0.3: {} - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.3.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.6.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pify@3.0.0: {} - /pixi.js@8.2.6: - resolution: {integrity: sha512-CNfr7CmjIEWJ06e3TBrXBKFpcTPMGUaFdtP4RlMOgNOTkDD6+Bhm728I/EkGAo2vsOVO1YwNFsuORQyD3MngZg==} + pixi.js@8.2.6: dependencies: '@pixi/colord': 2.9.6 '@types/css-font-loading-module': 0.0.12 @@ -6126,104 +7881,57 @@ packages: eventemitter3: 5.0.4 ismobilejs: 1.1.1 parse-svg-path: 0.1.2 - dev: false - /pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 mlly: 1.8.0 pathe: 2.0.3 - dev: true - /playwright-core@1.46.1: - resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} - engines: {node: '>=18'} - hasBin: true - dev: true + playwright-core@1.46.1: {} - /playwright@1.46.1: - resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} - engines: {node: '>=18'} - hasBin: true + playwright@1.46.1: dependencies: playwright-core: 1.46.1 optionalDependencies: fsevents: 2.3.2 - dev: true - /plur@4.0.0: - resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} - engines: {node: '>=10'} + plur@4.0.0: dependencies: irregular-plurals: 3.5.0 - dev: true - /pnpm@9.0.0: - resolution: {integrity: sha512-tBBnB8ciWxdIthWVlTzL6/+XtUrQXQAqo2NfYzucU81mb3zpuLxEcE8foEi5pJtVNxqy2enWZ9Hv4u8VFLzVEw==} - engines: {node: '>=18.12'} - hasBin: true - dev: true + pnpm@9.0.0: {} - /possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.1.0: {} - /postcss-resolve-nested-selector@0.1.6: - resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - dev: true + postcss-resolve-nested-selector@0.1.6: {} - /postcss-safe-parser@7.0.1(postcss@8.5.6): - resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} - engines: {node: '>=18.0'} - peerDependencies: - postcss: ^8.4.31 + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: postcss: 8.5.6 - dev: true - /postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - dev: true - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: false + prelude-ls@1.1.2: {} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.1: dependencies: fast-diff: 1.3.0 - dev: true - /prettier-package-json@2.8.0: - resolution: {integrity: sha512-WxtodH/wWavfw3MR7yK/GrS4pASEQ+iSTkdtSxPJWvqzG55ir5nvbLt9rw5AOiEcqqPCRM92WCtR1rk3TG3JSQ==} - hasBin: true + prettier-package-json@2.8.0: dependencies: '@types/parse-author': 2.0.3 commander: 4.1.1 @@ -6234,29 +7942,16 @@ packages: parse-author: 2.0.0 sort-object-keys: 1.1.3 sort-order: 1.1.2 - dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.2.5: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 - dev: true - /pretty-quick@4.0.0(prettier@3.2.5): - resolution: {integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - prettier: ^3.0.0 + pretty-quick@4.0.0(prettier@3.2.5): dependencies: execa: 5.1.1 find-up: 5.0.0 @@ -6266,25 +7961,14 @@ packages: picomatch: 3.0.1 prettier: 3.2.5 tslib: 2.8.1 - dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + process-nextick-args@2.0.1: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true + process@0.11.10: {} - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true + progress@2.0.3: {} - /proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} + proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@5.5.0) @@ -6296,111 +7980,63 @@ packages: socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + psl@1.15.0: dependencies: punycode: 2.3.1 - dev: true - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true + pstree.remy@1.1.8: {} - /pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.3: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - dev: true - /punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - dev: true + punycode.js@2.3.1: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /query-selector-shadow-dom@1.0.1: - resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} - dev: true + query-selector-shadow-dom@1.0.1: {} - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /react-dom@18.2.0(react@18.3.1): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - dev: true - /react-dom@19.0.0(react@19.0.0): - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 + react-dom@19.0.0(react@19.0.0): dependencies: react: 19.0.0 scheduler: 0.25.0 - dev: false - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true + react-is@18.3.1: {} - /react-reconciler@0.31.0(react@19.0.0): - resolution: {integrity: sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^19.0.0 + react-reconciler@0.31.0(react@19.0.0): dependencies: react: 19.0.0 scheduler: 0.25.0 - dev: false - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.14.2: {} - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - dev: true - /react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} + react@19.0.0: {} - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -6409,40 +8045,26 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 - dev: true - /readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdir-glob@1.1.3: dependencies: minimatch: 5.1.9 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - dev: true + readdirp@4.1.2: {} - /reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 @@ -6452,11 +8074,8 @@ packages: get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 - dev: true - /regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 @@ -6464,46 +8083,24 @@ packages: get-proto: 1.0.1 gopd: 1.2.0 set-function-name: 2.0.2 - dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@2.0.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + requires-port@1.0.0: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} - engines: {node: '>= 0.4'} - hasBin: true + resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 is-core-module: 2.16.1 @@ -6511,46 +8108,27 @@ packages: object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + resq@1.11.0: dependencies: fast-deep-equal: 2.0.1 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - dev: true + reusify@1.1.0: {} - /rgb2hex@0.2.5: - resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} - dev: true + rfdc@1.4.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rgb2hex@0.2.5: {} + + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /riteway@8.0.0-RC4(@types/node@25.6.0)(@vitest/browser@1.6.0)(jsdom@24.1.0)(react@18.3.1): - resolution: {integrity: sha512-zUqwi4jR1iVgVAFLRuBerhHilvGxHjxibW3wHdMh8EaYFAWywmmq0kaF9diibnJ3wLue/TVEqX6NtS/ePj/eGw==} - hasBin: true + riteway@8.0.0-RC4(@types/node@25.6.0)(@vitest/browser@1.6.0)(jsdom@24.1.0)(react@18.3.1): dependencies: cheerio: 1.0.0-rc.12 esm: 3.2.25 @@ -6572,12 +8150,8 @@ packages: - sugarss - supports-color - terser - dev: true - /rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: @@ -6607,127 +8181,73 @@ packages: '@rollup/rollup-win32-x64-gnu': 4.59.0 '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 - dev: true - /rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - dev: true + rrweb-cssom@0.7.1: {} - /rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - dev: true + rrweb-cssom@0.8.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + rxjs@7.8.2: dependencies: tslib: 2.8.1 - dev: true - /safaridriver@0.1.2: - resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} - dev: true + safaridriver@0.1.2: {} - /safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 isarray: 2.0.5 - dev: true - /safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - dev: true - /scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - dev: false + scheduler@0.25.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - dev: true + semver@7.7.4: {} - /serialize-error@11.0.3: - resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} - engines: {node: '>=14.16'} + serialize-error@11.0.3: dependencies: type-fest: 2.19.0 - dev: true - /seroval-plugins@1.5.2(seroval@1.5.2): - resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} - engines: {node: '>=10'} - peerDependencies: - seroval: ^1.0 + seroval-plugins@1.5.2(seroval@1.5.2): dependencies: seroval: 1.5.2 - /seroval@1.5.2: - resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} - engines: {node: '>=10'} + seroval@1.5.2: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -6735,195 +8255,121 @@ packages: get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + set-proto@1.0.0: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 - dev: true - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true + setimmediate@1.0.5: {} - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - dev: true + shell-quote@1.8.3: {} - /side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - dev: true - /side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + side-channel-map@1.0.1: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 - dev: true - /side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 - dev: true - /side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + side-channel@1.1.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + siginfo@2.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + simple-update-notifier@2.0.0: dependencies: semver: 7.7.4 - dev: true - /sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 - dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 - dev: true - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true + smart-buffer@4.2.0: {} - /socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} + socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@5.5.0) socks: 2.8.7 transitivePeerDependencies: - supports-color - dev: true - /socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + socks@2.8.7: dependencies: ip-address: 10.1.0 smart-buffer: 4.2.0 - dev: true - /solid-js@1.9.12: - resolution: {integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==} + solid-js@1.9.12: dependencies: csstype: 3.2.3 seroval: 1.5.2 seroval-plugins: 1.5.2(seroval@1.5.2) - /solid-refresh@0.6.3(solid-js@1.9.12): - resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} - peerDependencies: - solid-js: ^1.3 + solid-refresh@0.6.3(solid-js@1.9.12): dependencies: '@babel/generator': 7.29.1 '@babel/helper-module-imports': 7.28.6 @@ -6931,87 +8377,50 @@ packages: solid-js: 1.9.12 transitivePeerDependencies: - supports-color - dev: true - /sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - dev: true + sort-object-keys@1.1.3: {} - /sort-order@1.1.2: - resolution: {integrity: sha512-Q8tOrwB1TSv9fNUXym9st3TZJODtmcOIi2JWCkVNQPrRg17KPwlpwweTEb7pMwUIFMTAgx2/JsQQXEPFzYQj3A==} - dev: true + sort-order@1.1.2: {} - /source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.1: {} - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - requiresBuild: true + source-map@0.6.1: optional: true - /spacetrim@0.11.59: - resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} - dev: true + spacetrim@0.11.59: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.23 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.23 - dev: true - /spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - dev: true + spdx-license-ids@3.0.23: {} - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true + split2@4.2.0: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stackback@0.0.2: {} - /static-eval@2.0.2: - resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + static-eval@2.0.2: dependencies: escodegen: 1.14.3 - dev: false - /std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - dev: true + std-env@3.10.0: {} - /stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 - dev: true - /streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + streamx@2.23.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -7019,44 +8428,29 @@ packages: transitivePeerDependencies: - bare-abort-controller - react-native-b4a - dev: true - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.2.0 - dev: true - /string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} + string.prototype.padend@3.1.6: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.1 es-object-atoms: 1.1.1 - dev: true - /string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -7065,106 +8459,60 @@ packages: es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 - dev: true - /string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} + string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 - dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@2.1.1: - resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strip-literal@2.1.1: dependencies: js-tokens: 9.0.1 - dev: true - /strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - dev: true + strnum@1.1.2: {} - /stylelint-config-recommended@14.0.1(stylelint@16.2.1): - resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} - engines: {node: '>=18.12.0'} - peerDependencies: - stylelint: ^16.1.0 + stylelint-config-recommended@14.0.1(stylelint@16.2.1): dependencies: stylelint: 16.2.1(typescript@5.8.3) - dev: true - /stylelint-config-standard@36.0.0(stylelint@16.2.1): - resolution: {integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==} - engines: {node: '>=18.12.0'} - peerDependencies: - stylelint: ^16.1.0 + stylelint-config-standard@36.0.0(stylelint@16.2.1): dependencies: stylelint: 16.2.1(typescript@5.8.3) stylelint-config-recommended: 14.0.1(stylelint@16.2.1) - dev: true - /stylelint@16.2.1(typescript@5.8.3): - resolution: {integrity: sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==} - engines: {node: '>=18.12.0'} - hasBin: true + stylelint@16.2.1(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 @@ -7207,77 +8555,47 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true - /supports-hyperlinks@3.2.0: - resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} - engines: {node: '>=14.18'} + supports-hyperlinks@3.2.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: true + svg-tags@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: {} - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.2 tslib: 2.8.1 - dev: true - /tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - dev: false + tabbable@6.4.0: {} - /table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} + table@6.9.0: dependencies: ajv: 8.18.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /tape@5.9.0: - resolution: {integrity: sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA==} - hasBin: true + tape@5.9.0: dependencies: '@ljharb/resumer': 0.1.3 '@ljharb/through': 2.3.14 @@ -7301,10 +8619,8 @@ packages: object.assign: 4.1.7 resolve: 2.0.0-next.6 string.prototype.trim: 1.2.10 - dev: true - /tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + tar-fs@3.1.1: dependencies: pump: 3.0.3 tar-stream: 3.1.7 @@ -7315,10 +8631,8 @@ packages: - bare-abort-controller - bare-buffer - react-native-b4a - dev: true - /tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.1.7: dependencies: b4a: 1.8.0 fast-fifo: 1.3.2 @@ -7326,183 +8640,105 @@ packages: transitivePeerDependencies: - bare-abort-controller - react-native-b4a - dev: true - /teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + teex@1.0.1: dependencies: streamx: 2.23.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - dev: true optional: true - /text-decoder@1.2.7: - resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-decoder@1.2.7: dependencies: b4a: 1.8.0 transitivePeerDependencies: - react-native-b4a - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: true + tiny-invariant@1.3.3: {} - /tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - dev: true + tinybench@2.9.0: {} - /tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - dev: true - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.8.4: {} - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - dev: true + totalist@3.0.1: {} - /touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true - dev: true + touch@3.1.1: {} - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@4.1.4: dependencies: psl: 1.15.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true - /tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} + tr46@5.1.1: dependencies: punycode: 2.3.1 - dev: true - /ts-api-utils@1.4.3(typescript@5.8.3): - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.4.3(typescript@5.8.3): dependencies: typescript: 5.8.3 - dev: true - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - dev: true + tslib@2.8.1: {} - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 - dev: false - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - dev: true + type-detect@4.1.0: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /type-fest@4.26.0: - resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} - engines: {node: '>=16'} - dev: true + type-fest@4.26.0: {} - /typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 - dev: true - /typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - dev: true - /typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -7511,11 +8747,8 @@ packages: has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - dev: true - /typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 for-each: 0.3.5 @@ -7523,14 +8756,8 @@ packages: is-typed-array: 1.1.15 possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - dev: true - /typedoc@0.28.9(typescript@5.8.3): - resolution: {integrity: sha512-aw45vwtwOl3QkUAmWCnLV9QW1xY+FSX2zzlit4MAfE99wX+Jij4ycnpbAWgBXsRrxmfs9LaYktg/eX5Bpthd3g==} - engines: {node: '>= 18', pnpm: '>= 10'} - hasBin: true - peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typedoc@0.28.9(typescript@5.8.3): dependencies: '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 @@ -7538,121 +8765,65 @@ packages: minimatch: 9.0.9 typescript: 5.8.3 yaml: 2.8.2 - dev: true - /typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.8.3: {} - /uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - dev: true + uc.micro@2.1.0: {} - /ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - dev: true + ufo@1.6.3: {} - /unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - dev: true - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true + undefsafe@2.0.5: {} - /underscore@1.12.1: - resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - dev: false + underscore@1.12.1: {} - /undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - dev: true + undici-types@6.21.0: {} - /undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - dev: true + undici-types@7.19.2: {} - /undici@7.22.0: - resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} - engines: {node: '>=20.18.1'} - dev: true + undici@7.22.0: {} - /unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - dev: true + unicorn-magic@0.3.0: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.2.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /update-browserslist-db@1.2.3(browserslist@4.28.1): - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true - /urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} - dev: true + urlpattern-polyfill@10.1.0: {} - /userhome@1.0.1: - resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} - engines: {node: '>= 0.8.0'} - dev: true + userhome@1.0.1: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - dev: true + uuid@10.0.0: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /vite-node@1.6.0(@types/node@25.6.0): - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.6.0(@types/node@25.6.0): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@5.5.0) @@ -7668,44 +8839,8 @@ packages: - sugarss - supports-color - terser - dev: true - /vite-plugin-checker@0.12.0(typescript@5.8.3)(vite@5.1.1): - resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==} - engines: {node: '>=16.11'} - peerDependencies: - '@biomejs/biome': '>=1.7' - eslint: '>=9.39.1' - meow: ^13.2.0 - optionator: ^0.9.4 - oxlint: '>=1' - stylelint: '>=16' - typescript: '*' - vite: '>=5.4.21' - vls: '*' - vti: '*' - vue-tsc: ~2.2.10 || ^3.0.0 - peerDependenciesMeta: - '@biomejs/biome': - optional: true - eslint: - optional: true - meow: - optional: true - optionator: - optional: true - oxlint: - optional: true - stylelint: - optional: true - typescript: - optional: true - vls: - optional: true - vti: - optional: true - vue-tsc: - optional: true + vite-plugin-checker@0.12.0(typescript@5.8.3)(vite@5.1.1): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -7717,17 +8852,8 @@ packages: typescript: 5.8.3 vite: 5.1.1(@types/node@25.6.0) vscode-uri: 3.1.0 - dev: true - /vite-plugin-solid@2.11.0(solid-js@1.9.12)(vite@5.1.1): - resolution: {integrity: sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw==} - peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true + vite-plugin-solid@2.11.0(solid-js@1.9.12)(vite@5.1.1): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -7739,35 +8865,8 @@ packages: vitefu: 1.1.3(vite@5.1.1) transitivePeerDependencies: - supports-color - dev: true - /vite@5.1.1(@types/node@25.6.0): - resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.1.1(@types/node@25.6.0): dependencies: '@types/node': 25.6.0 esbuild: 0.19.12 @@ -7775,47 +8874,8 @@ packages: rollup: 4.59.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /vite@6.4.0(@types/node@25.6.0): - resolution: {integrity: sha512-oLnWs9Hak/LOlKjeSpOwD6JMks8BeICEdYMJBf6P4Lac/pO9tKiv/XhXnAM7nNfSkZahjlCZu9sS50zL8fSnsw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + vite@6.4.0(@types/node@25.6.0): dependencies: '@types/node': 25.6.0 esbuild: 0.25.12 @@ -7826,43 +8886,12 @@ packages: tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 - dev: true - /vitefu@1.1.3(vite@5.1.1): - resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - vite: - optional: true + vitefu@1.1.3(vite@5.1.1): dependencies: vite: 5.1.1(@types/node@25.6.0) - dev: true - /vitest@1.6.0(@types/node@25.6.0)(@vitest/browser@1.6.0): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@1.6.0(@types/node@25.6.0)(@vitest/browser@1.6.0): dependencies: '@types/node': 25.6.0 '@vitest/browser': 1.6.0(playwright@1.46.1)(vitest@1.6.0) @@ -7894,32 +8923,8 @@ packages: - sugarss - supports-color - terser - dev: true - /vitest@1.6.0(@types/node@25.6.0)(@vitest/browser@1.6.0)(jsdom@24.1.0): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@1.6.0(@types/node@25.6.0)(@vitest/browser@1.6.0)(jsdom@24.1.0): dependencies: '@types/node': 25.6.0 '@vitest/browser': 1.6.0(playwright@1.46.1)(vitest@1.6.0)(webdriverio@9.0.9) @@ -7952,39 +8957,24 @@ packages: - sugarss - supports-color - terser - dev: true - /vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - dev: true + vscode-uri@3.1.0: {} - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - dev: true - /wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} - engines: {node: '>=10'} - hasBin: true + wait-port@1.1.0: dependencies: chalk: 4.1.2 commander: 9.5.0 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: true - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: true + web-streams-polyfill@3.3.3: {} - /webdriver@9.0.8: - resolution: {integrity: sha512-UnV0ANriSTUgypGk0pz8lApeQuHt+72WEDQG5hFwkkSvggtKLyWdT7+PQkNoXvDajTmiLIqUOq8XPI/Pm71rtw==} - engines: {node: '>=18.20.0'} + webdriver@9.0.8: dependencies: '@types/node': 20.19.35 '@types/ws': 8.18.1 @@ -8002,16 +8992,8 @@ packages: - react-native-b4a - supports-color - utf-8-validate - dev: true - /webdriverio@9.0.9: - resolution: {integrity: sha512-IwvKzhcJ9NjOL55xwj27uTTKkfxsg77dmAfqoKFSP5dQ70JzU+NgxiALEjjWQDybtt1yGIkHk7wjjxjboMU1uw==} - engines: {node: '>=18.20.0'} - peerDependencies: - puppeteer-core: ^22.3.0 - peerDependenciesMeta: - puppeteer-core: - optional: true + webdriverio@9.0.9: dependencies: '@types/node': 20.19.35 '@types/sinonjs__fake-timers': 8.1.5 @@ -8047,48 +9029,29 @@ packages: - react-native-b4a - supports-color - utf-8-validate - dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: {} - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: {} - /whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} + whatwg-url@14.2.0: dependencies: tr46: 5.1.1 webidl-conversions: 7.0.0 - dev: true - /which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 - dev: true - /which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 function.prototype.name: 1.1.8 @@ -8103,21 +9066,15 @@ packages: which-boxed-primitive: 1.1.1 which-collection: 1.0.2 which-typed-array: 1.1.20 - dev: true - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.4 - dev: true - /which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -8126,133 +9083,68 @@ packages: get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true + which@4.0.0: dependencies: isexe: 3.1.5 - dev: true - /why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + word-wrap@1.2.5: {} - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.3 string-width: 5.1.2 strip-ansi: 7.2.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 - dev: true - /ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.19.0: {} - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + xml-name-validator@5.0.0: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + xmlchars@2.2.0: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + yaml@1.10.2: {} - /yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - dev: true + yaml@2.8.2: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -8261,30 +9153,18 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.2.2: {} - /zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} + zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.7.0 - dev: true From ee6fb05b225c9238429f38ecc6208e2f72b8a10b Mon Sep 17 00:00:00 2001 From: Kris Nye Date: Sat, 13 Jun 2026 21:05:10 -0700 Subject: [PATCH 2/2] refactor(data-gpu): tighten voxel shape pipeline and physics render scope Scope physicsBridge to collider-primitive archetypes only, decouple voxel visual bridge from it, add VoxelStaticCollider, and harden typing/lifecycle. Co-authored-by: Cursor --- .../pbr-render/physics-bridge-plugin.ts | 30 ++++++---- .../model/shape/boolean-volume-mesh.test.ts | 9 ++- .../model/shape/shape-geometry-plugin.ts | 3 + packages/data-gpu/src/index.ts | 8 ++- .../src/physics/physics-data-plugin.ts | 39 +++++++++++-- .../src/voxel-shape/require-voxel-shape.ts | 5 +- .../src/voxel-shape/voxel-shape-plugin.ts | 55 ++++++++----------- 7 files changed, 99 insertions(+), 50 deletions(-) diff --git a/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts b/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts index 6d72b0e4..00173a62 100644 --- a/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts +++ b/packages/data-gpu/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts @@ -1,7 +1,7 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. import { Database, type Entity } from "@adobe/data/ecs"; -import { physicsData } from "../../../physics/physics-data-plugin.js"; +import { COLLIDER_PRIMITIVE_RENDER_ARCHETYPES, physicsData } from "../../../physics/physics-data-plugin.js"; import { mesh } from "../../scene/model/mesh-plugin.js"; import { shapeGeometry } from "../../scene/model/shape/shape-geometry-plugin.js"; import { capsuleMesh, flatShadedMesh } from "../../scene/model/shape/shape-mesh.js"; @@ -12,9 +12,10 @@ import type { ColliderMesh } from "../../../physics/body/collider-mesh.js"; import { interpolation } from "../interpolation-plugin.js"; /** - * physicsRenderBridge — makes colliders renderable by `pbrFactorRender`. Once - * shared shape meshes exist, every body with a collider shape gains a `mesh` - * ref, a `scale`, and `visible`. Dynamic bodies also get render interpolation. + * physicsRenderBridge — assigns default primitive render meshes for standard + * physics archetypes (`COLLIDER_PRIMITIVE_RENDER_ARCHETYPES`). Collider shape + * drives the mesh; bodies on other archetypes (e.g. `VoxelRigidBody`) are not + * touched — their visual path owns `mesh` assignment separately. */ export const physicsRenderBridge = Database.Plugin.create({ extends: Database.Plugin.combine(physicsData, mesh, shapeGeometry, interpolation), @@ -69,20 +70,27 @@ export const physicsRenderBridge = Database.Plugin.create({ const shapes = db.store.resources._shapeMeshes; const device = db.store.resources.device; if (!shapes || !device) return; - for (const arch of db.store.queryArchetypes(["colliderShape", "halfExtents"], { exclude: ["mesh"] })) { - const ids = arch.columns.id, css = arch.columns.colliderShape, hes = arch.columns.halfExtents; + for (const name of COLLIDER_PRIMITIVE_RENDER_ARCHETYPES) { + const arch = db.store.archetypes[name]; + if (arch == null) continue; + const ids = arch.columns.id; + const css = arch.columns.colliderShape; + const hes = arch.columns.halfExtents; for (let i = arch.rowCount - 1; i >= 0; i--) { - const id = ids.get(i), shape = css.get(i), he = hes.get(i); - if ((db.store.read(id) as { voxelShape?: Entity }).voxelShape != null) continue; - let meshId: Entity, scale: [number, number, number]; + const id = ids.get(i); + if (db.store.get(id, "mesh") != null) continue; + const shape = css.get(i); + const he = hes.get(i); + let meshId: Entity; + let scale: [number, number, number]; if (shape === "box") { meshId = shapes.cube; scale = [he[0], he[1], he[2]]; } else if (shape === "capsule") { meshId = ensureCapsule(device, he[0], he[1]); scale = [1, 1, 1]; } else if (shape === "hull") { - const pts = (db.store.read(id) as { convexPoints?: Float32Array | null }).convexPoints; + const pts = db.store.get(id, "convexPoints"); meshId = pts ? ensureHull(device, pts) : shapes.sphere; scale = [1, 1, 1]; } else if (shape === "mesh") { - const cm = (db.store.read(id) as { colliderMesh?: ColliderMesh | null }).colliderMesh; + const cm = db.store.get(id, "colliderMesh"); meshId = cm ? ensureTriMesh(device, cm) : shapes.cube; scale = [1, 1, 1]; } else { meshId = shapes.sphere; scale = [he[0], he[0], he[0]]; } diff --git a/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts b/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts index 240ef8a1..e37a1671 100644 --- a/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts +++ b/packages/data-gpu/src/graphics/scene/model/shape/boolean-volume-mesh.test.ts @@ -9,8 +9,15 @@ import { volumeContentKey } from "../../../../voxel-shape/volume-content-key.js" describe("booleanVolumeMesh", () => { it("should emit no geometry for an empty volume", () => { - const volume = definitions.hollowFrame(); + const data = createTypedBuffer(Boolean.schema, 8); + const volume = DenseVolume.create({ size: [2, 2, 2], data }); const mesh = booleanVolumeMesh(volume); + expect(mesh.vertices.length).toBe(0); + expect(mesh.indices.length).toBe(0); + }); + + it("should emit shell geometry for hollowFrame", () => { + const mesh = booleanVolumeMesh(definitions.hollowFrame()); expect(mesh.vertices.length).toBeGreaterThan(0); expect(mesh.indices.length).toBeGreaterThan(0); }); diff --git a/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts b/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts index 2489cd3c..4e72f6ec 100644 --- a/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts +++ b/packages/data-gpu/src/graphics/scene/model/shape/shape-geometry-plugin.ts @@ -145,6 +145,9 @@ export const shapeGeometry = Database.Plugin.create({ ? { voxelVolumeSize: [...baked.voxelVolumeSize] as [number, number, number] } : {}), }); + if (baked.voxelVolumeSize != null) { + db.store.resources._voxelVolumeByMesh?.delete(meshId); + } } } }; diff --git a/packages/data-gpu/src/index.ts b/packages/data-gpu/src/index.ts index ec249018..284f689b 100644 --- a/packages/data-gpu/src/index.ts +++ b/packages/data-gpu/src/index.ts @@ -14,7 +14,13 @@ export { FrameTime } from "./core/frame-time/frame-time.js"; export { graphics } from "./graphics/graphics-plugin.js"; // --- Physics: shared rigid-body data model + pluggable solver seam ----------- -export { physicsData } from "./physics/physics-data-plugin.js"; +export { + physicsData, + RIGID_BODY_COMPONENTS, + STATIC_COLLIDER_COMPONENTS, + COLLIDER_PRIMITIVE_RENDER_ARCHETYPES, +} from "./physics/physics-data-plugin.js"; +export type { ColliderPrimitiveRenderArchetype } from "./physics/physics-data-plugin.js"; export { physicsClock } from "./physics/physics-clock-plugin.js"; export type { PhysicsClock } from "./physics/physics-clock-plugin.js"; export { jointData } from "./physics/joint/joint-plugin.js"; diff --git a/packages/data-gpu/src/physics/physics-data-plugin.ts b/packages/data-gpu/src/physics/physics-data-plugin.ts index 33ce4ca5..a5a224f7 100644 --- a/packages/data-gpu/src/physics/physics-data-plugin.ts +++ b/packages/data-gpu/src/physics/physics-data-plugin.ts @@ -8,6 +8,37 @@ import { ColliderShape } from "./body/collider-shape/collider-shape.js"; import type { ColliderMesh } from "./body/collider-mesh.js"; import { Material } from "../material/material.js"; +/** Column set shared by `RigidBody`, `ConvexBody`, and `VoxelRigidBody`. */ +export const RIGID_BODY_COMPONENTS = [ + "bodyType", + "colliderShape", + "halfExtents", + "material", + "position", + "rotation", + "linearVelocity", + "angularVelocity", +] as const; + +/** Column set shared by `StaticCollider`, `MeshCollider`, and `VoxelStaticCollider`. */ +export const STATIC_COLLIDER_COMPONENTS = [ + "colliderShape", + "halfExtents", + "material", + "position", + "rotation", +] as const; + +/** Physics archetypes whose visual mesh is the collider primitive (not an external override). */ +export const COLLIDER_PRIMITIVE_RENDER_ARCHETYPES = [ + "RigidBody", + "StaticCollider", + "ConvexBody", + "MeshCollider", +] as const; + +export type ColliderPrimitiveRenderArchetype = (typeof COLLIDER_PRIMITIVE_RENDER_ARCHETYPES)[number]; + /** * The shared, solver-agnostic rigid-body data model — the seam every physics * solver plugs into. It declares *only* authored/canonical state (no systems): @@ -63,11 +94,11 @@ export const physicsData = Database.Plugin.create({ colliderMesh: { default: null as ColliderMesh | null }, // colliderShape "mesh": static triangle soup }, archetypes: { - RigidBody: ["bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity"], - StaticCollider: ["colliderShape", "halfExtents", "material", "position", "rotation"], + RigidBody: [...RIGID_BODY_COMPONENTS], + StaticCollider: [...STATIC_COLLIDER_COMPONENTS], // A convex-hull body (dynamic / kinematic): authored as a point cloud. - ConvexBody: ["bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity", "convexPoints"], + ConvexBody: [...RIGID_BODY_COMPONENTS, "convexPoints"], // A static triangle-mesh collider (terrain / level geometry). - MeshCollider: ["colliderShape", "halfExtents", "material", "position", "rotation", "colliderMesh"], + MeshCollider: [...STATIC_COLLIDER_COMPONENTS, "colliderMesh"], }, }); diff --git a/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts b/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts index a7014da2..7fbfb76d 100644 --- a/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts +++ b/packages/data-gpu/src/voxel-shape/require-voxel-shape.ts @@ -1,16 +1,17 @@ // © 2026 Adobe. MIT License. See /LICENSE for details. import type { Entity } from "@adobe/data/ecs"; +import type { VoxelShapeName } from "./voxel-shape-definitions.js"; /** Store or transaction surface that exposes the voxel shape name index. */ export interface VoxelShapeByNameLookup { resources: { - _voxelShapeByName: Map | null; + _voxelShapeByName: Map | null; }; } /** Returns the baked-or-pending mesh entity for `name`, or throws if never seeded. */ -export const requireVoxelShape = (db: VoxelShapeByNameLookup, name: string): Entity => { +export const requireVoxelShape = (db: VoxelShapeByNameLookup, name: VoxelShapeName): Entity => { const mesh = db.resources._voxelShapeByName?.get(name) ?? null; if (mesh == null) { throw new Error( diff --git a/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts b/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts index 2a6adfb7..ae95ebb2 100644 --- a/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts +++ b/packages/data-gpu/src/voxel-shape/voxel-shape-plugin.ts @@ -3,12 +3,12 @@ import { Database, Entity } from "@adobe/data/ecs"; import type { DenseVolume } from "@adobe/data/volume"; import type { Vec3 } from "@adobe/data/math"; -import { physicsData } from "../physics/physics-data-plugin.js"; +import { physicsData, RIGID_BODY_COMPONENTS, STATIC_COLLIDER_COMPONENTS } from "../physics/physics-data-plugin.js"; import { mesh } from "../graphics/scene/model/mesh-plugin.js"; import { shapeGeometry } from "../graphics/scene/model/shape/shape-geometry-plugin.js"; import { physicsRenderBridge } from "../graphics/rendering/pbr-render/physics-bridge-plugin.js"; import type { ShapeSpec } from "../graphics/scene/model/shape/shape-spec.js"; -import { definitions } from "./voxel-shape-definitions.js"; +import { definitions, type VoxelShapeName } from "./voxel-shape-definitions.js"; import { volumeContentKey } from "./volume-content-key.js"; const insertVoxelShapeMesh = ( @@ -44,17 +44,6 @@ const insertVoxelShapeMesh = ( * volume content, and attaches baked mesh refs to bodies that reference them. * Physics colliders stay unchanged; only the visual mesh is overridden. */ -const RIGID_BODY_COMPONENTS = [ - "bodyType", - "colliderShape", - "halfExtents", - "material", - "position", - "rotation", - "linearVelocity", - "angularVelocity", -] as const; - export const voxelShape = Database.Plugin.create({ extends: Database.Plugin.combine(mesh, shapeGeometry, physicsData), components: { @@ -63,11 +52,13 @@ export const voxelShape = Database.Plugin.create({ }, resources: { _voxelMeshByKey: { default: null as Map | null, transient: true }, - _voxelShapeByName: { default: null as Map | null, transient: true }, + _voxelShapeByName: { default: null as Map | null, transient: true }, }, archetypes: { - /** Same as RigidBody but carries a voxelShape mesh ref at insert time. */ + /** Same as RigidBody but visual mesh comes from `voxelShape`, not the collider primitive. */ VoxelRigidBody: [...RIGID_BODY_COMPONENTS, "voxelShape"], + /** Same as StaticCollider but visual mesh comes from `voxelShape`, not the collider primitive. */ + VoxelStaticCollider: [...STATIC_COLLIDER_COMPONENTS, "voxelShape"], }, transactions: { insertVoxelShapeMesh(t, args: { volume: DenseVolume }): Entity { @@ -75,21 +66,24 @@ export const voxelShape = Database.Plugin.create({ }, seedVoxelShapeDefinitions(t) { const byName = t.resources._voxelShapeByName ??= new Map(); - for (const [name, factory] of Object.entries(definitions)) { - byName.set(name, insertVoxelShapeMesh(t, { volume: factory() })); + for (const name of Object.keys(definitions) as VoxelShapeName[]) { + byName.set(name, insertVoxelShapeMesh(t, { volume: definitions[name]() })); } }, }, }); -/** Attaches voxel mesh refs to physics bodies after the default cube bridge runs. */ +/** Assigns baked voxel mesh refs to voxel physics rows (not handled by `physicsBridge`). */ export const voxelShapeVisualBridge = Database.Plugin.create({ - extends: Database.Plugin.combine(voxelShape, physicsRenderBridge), + extends: voxelShape, systems: { voxelShapeVisualBridge: { - schedule: { during: ["postUpdate"], after: ["physicsBridge"] }, + schedule: { during: ["postUpdate"] }, create: db => () => { - for (const arch of db.store.queryArchetypes(["voxelShape", "halfExtents"])) { + for (const arch of db.store.queryArchetypes( + ["voxelShape", "halfExtents"], + { exclude: ["mesh"] }, + )) { const ids = arch.columns.id; const voxelShapes = arch.columns.voxelShape; const halfExtents = arch.columns.halfExtents; @@ -97,21 +91,16 @@ export const voxelShapeVisualBridge = Database.Plugin.create({ const id = ids.get(i); const meshId = voxelShapes.get(i); const he = halfExtents.get(i); - const meshRow = db.store.read(meshId) as { - voxelVolumeSize?: Vec3 | null; - localBounds?: unknown; - }; - const volumeSize = meshRow.voxelVolumeSize; + const localBounds = db.store.get(meshId, "localBounds"); + const volumeSize = db.store.get(meshId, "voxelVolumeSize"); // Wait until shapeMeshBake has produced a StaticMesh + _PbrPrimitive. - if (volumeSize == null || meshRow.localBounds == null) continue; + if (volumeSize == null || localBounds == null) continue; const scale: Vec3 = [ (2 * he[0]) / volumeSize[0], (2 * he[1]) / volumeSize[1], (2 * he[2]) / volumeSize[2], ]; - const current = db.store.read(id) as { mesh?: Entity; scale?: Vec3 }; - if (current.mesh === meshId && current.scale?.[0] === scale[0]) continue; db.store.update(id, { mesh: meshId, scale, visible: true }); } } @@ -120,5 +109,9 @@ export const voxelShapeVisualBridge = Database.Plugin.create({ }, }); -/** Combined plugin for samples: voxel visuals + physics cube bridge. */ -export const voxelShapeRender = Database.Plugin.combine(voxelShape, voxelShapeVisualBridge); +/** Convenience bundle: voxel visuals + default collider primitive bridge for other physics archetypes. */ +export const voxelShapeRender = Database.Plugin.combine( + voxelShape, + voxelShapeVisualBridge, + physicsRenderBridge, +);