├── .gitignore
├── game
├── .gitignore
├── src
│ ├── server
│ │ ├── index.ts
│ │ └── tsconfig.json
│ ├── client
│ │ ├── tsconfig.json
│ │ ├── util.ts
│ │ ├── classes
│ │ │ ├── Camera.ts
│ │ │ ├── Raycast.ts
│ │ │ └── NuiComms.ts
│ │ └── index.ts
│ └── shared
│ │ ├── logger.ts
│ │ └── vector3.ts
├── package.json
├── esbuild.cjs
└── pnpm-lock.yaml
├── ui
├── src
│ ├── constants.ts
│ ├── vite-env.d.ts
│ ├── style.scss
│ ├── components
│ │ └── ui
│ │ │ ├── index.tsx
│ │ │ └── ui.module.scss
│ ├── lib
│ │ ├── util.ts
│ │ └── NuiComms.ts
│ ├── main.tsx
│ └── index.tsx
├── tsconfig.vite.json
├── vite.config.ts
├── .gitignore
├── index.html
├── tsconfig.json
├── package.json
├── public
│ └── vite.svg
└── pnpm-lock.yaml
├── .vscode
└── settings.json
├── shared
└── types
│ ├── util.ts
│ └── nui-comms.ts
├── fxmanifest.lua
├── package.json
├── README.md
├── biome.json
├── yarn.lock
└── pnpm-lock.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/game/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
--------------------------------------------------------------------------------
/ui/src/constants.ts:
--------------------------------------------------------------------------------
1 | export const ROTATION_ORDER = 'YZX';
2 |
--------------------------------------------------------------------------------
/ui/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/game/src/server/index.ts:
--------------------------------------------------------------------------------
1 | setImmediate(() => {
2 | console.log('Server is running...');
3 | });
4 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.exclude": {
3 | "**/node_modules": true
4 | },
5 | "typescript.tsdk": "./node_modules/typescript/lib"
6 | }
7 |
--------------------------------------------------------------------------------
/ui/src/style.scss:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | }
5 |
6 | #root {
7 | width: 100vw;
8 | height: 100vh;
9 | overflow: hidden;
10 | }
11 |
--------------------------------------------------------------------------------
/shared/types/util.ts:
--------------------------------------------------------------------------------
1 | export type Vec3 = { x: number; y: number; z: number };
2 |
3 | export type ObjEntries = {
4 | [K in keyof T]: [K, T[K]];
5 | }[keyof T][];
6 |
--------------------------------------------------------------------------------
/ui/tsconfig.vite.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true
8 | },
9 | "include": ["vite.config.ts"]
10 | }
11 |
--------------------------------------------------------------------------------
/fxmanifest.lua:
--------------------------------------------------------------------------------
1 | fx_version 'cerulean'
2 | game 'gta5'
3 |
4 | client_scripts {
5 | 'game/dist/client.js'
6 | }
7 |
8 | server_scripts {
9 | 'game/dist/server.js'
10 | }
11 |
12 | ui_page 'ui/dist/index.html'
13 |
14 | files {
15 | 'ui/dist/index.html',
16 | 'ui/dist/assets/*'
17 | }
--------------------------------------------------------------------------------
/ui/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import react from '@vitejs/plugin-react-swc';
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | base: './',
7 | build: {
8 | emptyOutDir: true,
9 | },
10 | plugins: [react()],
11 | });
12 |
13 |
--------------------------------------------------------------------------------
/ui/src/components/ui/index.tsx:
--------------------------------------------------------------------------------
1 | import { FC } from "react";
2 |
3 | import styles from "./ui.module.scss";
4 |
5 | export const UI: FC = () => {
6 | return (
7 |
8 |
11 |
12 | );
13 | };
14 |
--------------------------------------------------------------------------------
/ui/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/ui/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | UI
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "fivem-threejs-wrapper",
3 | "version": "1.0.0",
4 | "author": "gallejens",
5 | "license": "ISC",
6 | "scripts": {
7 | "build": "cd game && pnpm build && cd ../ui && pnpm build",
8 | "watch": "cd game && pnpm watch",
9 | "fullinstall": "cd game && pnpm i && cd ../ui && pnpm i"
10 | },
11 | "devDependencies": {
12 | "@biomejs/biome": "1.5.3",
13 | "typescript": "5.3.3"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/ui/src/components/ui/ui.module.scss:
--------------------------------------------------------------------------------
1 | $primary-color: #fa5252;
2 | $white-color: #e0e0e0;
3 |
4 | .ui {
5 | width: auto;
6 | height: auto;
7 |
8 | & > .button {
9 | width: 9vh;
10 | height: 9vh;
11 | background-color: $primary-color;
12 | border: none;
13 | border-radius: 1.5vh;
14 |
15 | font-size: 5.5vh;
16 | color: $white-color;
17 | font-weight: bold;
18 |
19 | box-shadow: 0px 0px 50px 20px rgba(0, 0, 0, 0.1);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/ui/src/lib/util.ts:
--------------------------------------------------------------------------------
1 | import { Vec3 } from '@shared/types/util';
2 |
3 | export const transformCoords = (gtaCoords: Vec3) => {
4 | const { x, y, z } = gtaCoords;
5 | return {
6 | x,
7 | y: z,
8 | z: y * -1,
9 | };
10 | };
11 |
12 | export const transformRotation = (gtaRotation: Vec3) => {
13 | return {
14 | x: gtaRotation.x,
15 | y: Math.abs(gtaRotation.y) > Math.PI / 4 ? -gtaRotation.z : gtaRotation.z,
16 | z: gtaRotation.y,
17 | };
18 | };
19 |
--------------------------------------------------------------------------------
/ui/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { Canvas } from "@react-three/fiber";
2 | import React from "react";
3 | import ReactDOM from "react-dom/client";
4 | import { App } from ".";
5 |
6 | import "./style.scss";
7 |
8 | const rootEl = document.getElementById("root");
9 | if (!rootEl) throw new Error("No root element");
10 |
11 | const root = ReactDOM.createRoot(rootEl);
12 | root.render(
13 |
14 |
17 |
18 | );
19 |
--------------------------------------------------------------------------------
/game/src/client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "strict": true,
5 | "esModuleInterop": true,
6 | "allowSyntheticDefaultImports": true,
7 | "module": "CommonJS",
8 | "types": ["@types/node", "@citizenfx/client"],
9 | "lib": ["ES2020"],
10 | "skipLibCheck": true,
11 | "paths": {
12 | "@shared/*": ["../../../shared/*"]
13 | }
14 | },
15 | "include": ["./**/*", "../../../shared", "../shared/**/*"],
16 | "exclude": ["**/node_modules"]
17 | }
18 |
--------------------------------------------------------------------------------
/game/src/server/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "strict": true,
5 | "esModuleInterop": true,
6 | "allowSyntheticDefaultImports": true,
7 | "module": "CommonJS",
8 | "types": ["@types/node", "@citizenfx/server"],
9 | "lib": ["ES2020"],
10 | "skipLibCheck": true,
11 | "paths": {
12 | "@shared/*": ["../../../shared/*"]
13 | }
14 | },
15 | "include": ["./**/*", "../../../shared", "../shared/**/*"],
16 | "exclude": ["**/node_modules"]
17 | }
18 |
--------------------------------------------------------------------------------
/game/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "game",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "type": "module",
6 | "scripts": {
7 | "build": "pnpm typecheck && node esbuild.cjs",
8 | "watch": "pnpm typecheck && node esbuild.cjs --watch",
9 | "typecheck": "tsc --noEmit -p src/client/tsconfig.json && tsc --noEmit -p src/server/tsconfig.json"
10 | },
11 | "devDependencies": {
12 | "@citizenfx/client": "2.0.7345-1",
13 | "@citizenfx/server": "2.0.7345-1",
14 | "@types/node": "^20.11.6",
15 | "esbuild": "^0.19.12",
16 | "typescript": "5.3.3"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/game/src/shared/logger.ts:
--------------------------------------------------------------------------------
1 | type Level = 'INFO' | 'WARN' | 'ERROR' | 'DEBUG';
2 |
3 | export class Logger {
4 | private name: string;
5 |
6 | constructor(name: string) {
7 | this.name = name;
8 | }
9 |
10 | private log(level: Level, ...args: string[]) {
11 | console.log(`[${this.name}] (${level}) ${args.join(' ')}`);
12 | }
13 |
14 | public info(...args: string[]) {
15 | this.log('INFO', ...args);
16 | }
17 |
18 | public warn(...args: string[]) {
19 | this.log('WARN', ...args);
20 | }
21 |
22 | public error(...args: string[]) {
23 | this.log('ERROR', ...args);
24 | }
25 |
26 | public debug(...args: string[]) {
27 | this.log('DEBUG', ...args);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # fivem-threejs-wrapper
2 |
3 | ## Showcase
4 |
5 | - https://youtu.be/ThgPESyyvRU
6 |
7 | - By default it should show a 'E' interact button inside default MRPD.
8 |
9 | ## What is this?
10 |
11 | This is a showcase/template resource on how to use ThreeJS in FiveM.
12 | You could use this to create inworld UIs, object movement gizmo, etc...
13 |
14 | ## How to use
15 |
16 | React & TS knowledge is required to use this resource.
17 |
18 | ```
19 | npm fullinstall && npm run build
20 | ```
21 |
22 | ### Tools
23 |
24 | - There is a '/raycast' command available to get a position and surfacenormal.
25 |
26 | ## Disclaimer
27 |
28 | This is not a complete resource, you will need to add your own logic to actually make use of it.
29 |
--------------------------------------------------------------------------------
/ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 | "baseUrl": "./",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true,
23 | "paths": {
24 | "@shared/*": ["../shared/*"]
25 | }
26 | },
27 | "include": ["src", "../shared"],
28 | "references": [{ "path": "./tsconfig.vite.json" }]
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/ui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ui",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "watch": "tsc && vite build --watch"
10 | },
11 | "dependencies": {
12 | "@react-three/drei": "^9.96.5",
13 | "@react-three/fiber": "^8.15.15",
14 | "@uidotdev/usehooks": "^2.4.1",
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "sass": "^1.70.0",
18 | "three": "^0.160.1"
19 | },
20 | "devDependencies": {
21 | "@types/react": "^18.2.43",
22 | "@types/react-dom": "^18.2.17",
23 | "@types/three": "^0.160.0",
24 | "@typescript-eslint/eslint-plugin": "^6.14.0",
25 | "@typescript-eslint/parser": "^6.14.0",
26 | "@vitejs/plugin-react-swc": "^3.5.0",
27 | "typescript": "^5.2.2",
28 | "vite": "^5.0.8"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/game/src/client/util.ts:
--------------------------------------------------------------------------------
1 | import { Vec3 } from '@shared/types/util';
2 |
3 | export const getEntityCoords = (entity: number): Vec3 => {
4 | const [x, y, z] = GetEntityCoords(entity, true);
5 | return { x, y, z };
6 | };
7 |
8 | export function radToDeg(rad: number): number;
9 | export function radToDeg(rad: Vec3): Vec3;
10 | export function radToDeg(rad: number | Vec3): number | Vec3 {
11 | if (typeof rad === 'number') {
12 | return (rad * 180) / Math.PI;
13 | }
14 |
15 | return {
16 | x: (rad.x * 180) / Math.PI,
17 | y: (rad.y * 180) / Math.PI,
18 | z: (rad.z * 180) / Math.PI,
19 | };
20 | }
21 |
22 | export function degToRad(deg: number): number;
23 | export function degToRad(deg: Vec3): Vec3;
24 | export function degToRad(deg: number | Vec3): number | Vec3 {
25 | if (typeof deg === 'number') {
26 | return (deg * Math.PI) / 180;
27 | }
28 |
29 | return {
30 | x: (deg.x * Math.PI) / 180,
31 | y: (deg.y * Math.PI) / 180,
32 | z: (deg.z * Math.PI) / 180,
33 | };
34 | }
35 |
--------------------------------------------------------------------------------
/shared/types/nui-comms.ts:
--------------------------------------------------------------------------------
1 | import { Vec3 } from './util';
2 |
3 | export namespace NUIComms {
4 | export type Event = {
5 | update: {
6 | camera: {
7 | position: Vec3;
8 | rotation: Vec3;
9 | meta?: {
10 | fov: number;
11 | near: number;
12 | far: number;
13 | };
14 | };
15 | };
16 | };
17 |
18 | export type EventBody = {
19 | [K in keyof Event]: {
20 | action: K;
21 | data: Event[K];
22 | };
23 | }[keyof Event];
24 |
25 | // NUI -> Game Request
26 | type RequestWrapper = {
27 | data: Data;
28 | response: Response;
29 | };
30 |
31 | export type Request = {
32 | ready: RequestWrapper;
33 | };
34 |
35 | export type Response = {
36 | data: Request[T]['response'];
37 | meta:
38 | | {
39 | ok: true;
40 | }
41 | | {
42 | ok: false;
43 | message: string;
44 | };
45 | };
46 | }
47 |
--------------------------------------------------------------------------------
/ui/src/lib/NuiComms.ts:
--------------------------------------------------------------------------------
1 | import { type NUIComms } from '@shared/types/nui-comms';
2 |
3 | class NuiComms {
4 | private endpoint: string;
5 |
6 | constructor() {
7 | if (import.meta.env.PROD) {
8 | //@ts-ignore
9 | this.endpoint = `https://${GetParentResourceName()}/request`;
10 | } else {
11 | this.endpoint = '';
12 | }
13 | }
14 |
15 | public async request(
16 | action: T,
17 | data: NUIComms.Request[T]['data'] = null
18 | ): Promise {
19 | if (import.meta.env.DEV) return null;
20 |
21 | const result: NUIComms.Response = await fetch(this.endpoint, {
22 | method: 'post',
23 | headers: {
24 | 'Content-Type': 'application/json; charset=UTF-8',
25 | },
26 | body: JSON.stringify({
27 | action,
28 | data,
29 | }),
30 | }).then(res => res.json());
31 |
32 | if (!result.meta.ok) {
33 | throw new Error(result.meta.message);
34 | }
35 |
36 | return result.data;
37 | }
38 | }
39 |
40 | export const nuiComms = new NuiComms();
41 |
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json",
3 | "organizeImports": {
4 | "enabled": true
5 | },
6 | "linter": {
7 | "enabled": true,
8 | "rules": {
9 | "recommended": true,
10 | "suspicious": {
11 | "noConfusingVoidType": "off",
12 | "noExplicitAny": "off"
13 | },
14 | "complexity": {
15 | "noForEach": "off",
16 | "noBannedTypes": "off"
17 | },
18 | "style": {
19 | "noNonNullAssertion": "off"
20 | },
21 | "a11y": {
22 | "useKeyWithClickEvents": "off"
23 | },
24 | "correctness": {
25 | "useExhaustiveDependencies": "off"
26 | }
27 | }
28 | },
29 | "formatter": {
30 | "enabled": true,
31 | "lineWidth": 80,
32 | "indentStyle": "space",
33 | "indentWidth": 2,
34 | "lineEnding": "lf"
35 | },
36 | "javascript": {
37 | "formatter": {
38 | "arrowParentheses": "asNeeded",
39 | "jsxQuoteStyle": "single",
40 | "semicolons": "always",
41 | "trailingComma": "es5",
42 | "quoteProperties": "asNeeded",
43 | "bracketSpacing": true,
44 | "bracketSameLine": false
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/game/esbuild.cjs:
--------------------------------------------------------------------------------
1 | const esbuild = require("esbuild");
2 |
3 | const IS_WATCH_MODE = process.argv[2] === "--watch";
4 |
5 | const TARGET_ENTRIES = [
6 | {
7 | target: "es2020",
8 | entryPoints: ["src/client/index.ts"],
9 | outfile: "dist/client.js",
10 | },
11 | {
12 | target: "node16",
13 | entryPoints: ["src/server/index.ts"],
14 | platform: "node",
15 | outfile: "dist/server.js",
16 | },
17 | ];
18 |
19 | const buildBundle = async () => {
20 | try {
21 | const baseOptions = {
22 | logLevel: "info",
23 | bundle: true,
24 | charset: "utf8",
25 | minifyWhitespace: true,
26 | absWorkingDir: process.cwd(),
27 | };
28 |
29 | for (const targetOpts of TARGET_ENTRIES) {
30 | const mergedOpts = { ...baseOptions, ...targetOpts };
31 |
32 | if (IS_WATCH_MODE) {
33 | const context = await esbuild.context(mergedOpts);
34 | await context.watch();
35 | continue;
36 | }
37 |
38 | const { errors } = await esbuild.build(mergedOpts);
39 |
40 | if (errors.length) {
41 | console.error(`[ESBuild] Bundle failed with ${errors.length} errors`);
42 | process.exit(1);
43 | }
44 | }
45 | } catch (e) {
46 | console.log("[ESBuild] Build failed with error");
47 | console.error(e);
48 | process.exit(1);
49 | }
50 | };
51 |
52 | buildBundle().catch(() => process.exit(1));
53 |
--------------------------------------------------------------------------------
/ui/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/game/src/client/classes/Camera.ts:
--------------------------------------------------------------------------------
1 | import { NUIComms } from '@shared/types/nui-comms';
2 | import { ObjEntries } from '@shared/types/util';
3 | import { degToRad } from '../util';
4 | import { nuiComms } from './NuiComms';
5 |
6 | class Camera {
7 | private metadata: Required['meta'];
8 | private thread: NodeJS.Timer | null;
9 |
10 | constructor() {
11 | this.metadata = {
12 | fov: 0,
13 | near: 0,
14 | far: 0,
15 | };
16 | this.thread = null;
17 | }
18 |
19 | public startThread() {
20 | if (this.thread) return;
21 |
22 | this.thread = setInterval(this.onFrame, 4);
23 | }
24 |
25 | private onFrame = () => {
26 | const newMetadata: typeof this.metadata = {
27 | fov: GetFinalRenderedCamFov(),
28 | near: GetFinalRenderedCamNearClip(),
29 | far: GetFinalRenderedCamFarClip(),
30 | };
31 |
32 | const metaChanged = (
33 | Object.entries(newMetadata) as ObjEntries
34 | ).some(([k, v]) => this.metadata[k] !== v);
35 |
36 | nuiComms.send('update', {
37 | camera: {
38 | position: this.getCameraPosition(),
39 | rotation: this.getCameraRotation(),
40 | meta: metaChanged ? newMetadata : undefined,
41 | },
42 | });
43 |
44 | this.metadata = newMetadata;
45 | };
46 |
47 | private getCameraPosition() {
48 | const [x, y, z] = GetFinalRenderedCamCoord();
49 | return { x, y, z };
50 | }
51 |
52 | private getCameraRotation() {
53 | const [x, y, z] = GetFinalRenderedCamRot(1);
54 | return degToRad({ x, y, z });
55 | }
56 | }
57 |
58 | export const camera = new Camera();
59 |
--------------------------------------------------------------------------------
/game/src/client/index.ts:
--------------------------------------------------------------------------------
1 | import { camera } from './classes/Camera';
2 | import { nuiComms } from './classes/NuiComms';
3 | import { Raycast } from './classes/Raycast';
4 | import { getEntityCoords } from './util';
5 |
6 | setImmediate(async () => {
7 | await nuiComms.init();
8 |
9 | camera.startThread();
10 | });
11 |
12 | RegisterCommand(
13 | 'raycast',
14 | async () => {
15 | const raycast = await new Promise(res => {
16 | const thread = setInterval(() => {
17 | const raycast = new Raycast();
18 | if (!raycast.hit || !raycast.coords || !raycast.surfaceNormal) return;
19 |
20 | const plyCoords = getEntityCoords(PlayerPedId());
21 | DrawLine(
22 | plyCoords.x,
23 | plyCoords.y,
24 | plyCoords.z,
25 | raycast.coords.x,
26 | raycast.coords.y,
27 | raycast.coords.z,
28 | 0,
29 | 0,
30 | 255,
31 | 255
32 | );
33 | DrawMarker(
34 | 28,
35 | raycast.coords.x,
36 | raycast.coords.y,
37 | raycast.coords.z,
38 | 0,
39 | 0,
40 | 0,
41 | 0,
42 | 0,
43 | 0,
44 | 0.05,
45 | 0.05,
46 | 0.05,
47 | 0,
48 | 0,
49 | 255,
50 | 255,
51 | false,
52 | true,
53 | 2,
54 | false,
55 | //@ts-ignore
56 | null,
57 | null,
58 | false
59 | );
60 | if (IsControlJustPressed(0, 18)) {
61 | clearInterval(thread);
62 | res(raycast);
63 | return;
64 | }
65 | }, 0);
66 | });
67 |
68 | if (!raycast.hit || !raycast.coords || !raycast.surfaceNormal) return;
69 |
70 | const surfaceRotation = raycast.getSurfaceRotation();
71 |
72 | console.log(
73 | 'Do not forget to transform these coords to threejs coordsystem'
74 | );
75 | console.log({ coords: raycast.coords, rotation: surfaceRotation });
76 | },
77 | false
78 | );
79 |
--------------------------------------------------------------------------------
/ui/src/index.tsx:
--------------------------------------------------------------------------------
1 | import { Html } from "@react-three/drei";
2 | import { useThree } from "@react-three/fiber";
3 | import { NUIComms } from "@shared/types/nui-comms";
4 | import { FC, useEffect, useState } from "react";
5 | import { Euler } from "three";
6 | import { UI } from "./components/ui";
7 | import { ROTATION_ORDER } from "./constants";
8 | import { nuiComms } from "./lib/NuiComms";
9 | import { transformCoords, transformRotation } from "./lib/util";
10 |
11 | export const App: FC = () => {
12 | const [isReady, setIsReady] = useState(false);
13 | const { camera } = useThree(s => ({ camera: s.camera }));
14 |
15 | if (!("isPerspectiveCamera" in camera)) {
16 | console.error("Main camera is not perspective camera");
17 | return null;
18 | }
19 |
20 | useEffect(() => {
21 | const handler = ({ data: event }: MessageEvent) => {
22 | switch (event.action) {
23 | case "update": {
24 | if (event.data.camera.meta) {
25 | camera.near = event.data.camera.meta.near;
26 | camera.far = event.data.camera.meta.far;
27 | camera.fov = event.data.camera.meta.fov;
28 | camera.rotation.order = ROTATION_ORDER;
29 | camera.updateProjectionMatrix();
30 | }
31 |
32 | const camPos = transformCoords(event.data.camera.position);
33 | camera.position.set(camPos.x, camPos.y, camPos.z);
34 |
35 | const camRot = transformRotation(event.data.camera.rotation);
36 | camera.rotation.set(camRot.x, camRot.y, camRot.z);
37 | }
38 | }
39 | };
40 |
41 | window.addEventListener("message", handler);
42 | setIsReady(true);
43 |
44 | return () => {
45 | window.removeEventListener("message", handler);
46 | };
47 | }, [camera]);
48 |
49 | // send ready event on first ready
50 | useEffect(() => {
51 | if (!isReady) return;
52 |
53 | nuiComms.request("ready");
54 | }, [isReady]);
55 |
56 | return (
57 | <>
58 |
62 |
63 |
64 |
65 |
66 | >
67 | );
68 | };
69 |
--------------------------------------------------------------------------------
/game/src/client/classes/Raycast.ts:
--------------------------------------------------------------------------------
1 | import { Vec3 } from '@shared/types/util';
2 | import { Vector3 } from '../../shared/vector3';
3 |
4 | export class Raycast {
5 | private readonly _hit: boolean;
6 | private readonly _entity: number | null;
7 | private readonly _surfaceNormal: Vec3 | null;
8 | private readonly _coords: Vec3 | null;
9 |
10 | constructor(distance = 25.0, flag = -1, ignore = PlayerPedId()) {
11 | const cameraCoords = Vector3.create(GetGameplayCamCoord());
12 | const cameraRotation = Vector3.create(GetGameplayCamRot(0));
13 | const forwardVector = Raycast.getForwardVector(cameraRotation);
14 | const forwardCoords = cameraCoords.add(forwardVector.multiply(distance));
15 |
16 | const handle = StartExpensiveSynchronousShapeTestLosProbe(
17 | cameraCoords.x,
18 | cameraCoords.y,
19 | cameraCoords.z,
20 | forwardCoords.x,
21 | forwardCoords.y,
22 | forwardCoords.z,
23 | flag,
24 | ignore,
25 | 0
26 | );
27 | const [
28 | _,
29 | hit,
30 | [hitCoordX, hitCoordY, hitCoordZ],
31 | [surfaceNormalX, surfaceNormalY, surfaceNormalZ],
32 | entityHit,
33 | ] = GetShapeTestResult(handle);
34 |
35 | this._hit = !!hit;
36 |
37 | if (this._hit) {
38 | this._coords = { x: hitCoordX, y: hitCoordY, z: hitCoordZ };
39 | this._surfaceNormal = {
40 | x: surfaceNormalX,
41 | y: surfaceNormalY,
42 | z: surfaceNormalZ,
43 | };
44 |
45 | if (
46 | entityHit &&
47 | DoesEntityExist(entityHit) &&
48 | GetEntityType(entityHit) !== 0
49 | ) {
50 | this._entity = entityHit;
51 | } else {
52 | this._entity = null;
53 | }
54 | } else {
55 | this._coords = null;
56 | this._surfaceNormal = null;
57 | this._entity = null;
58 | }
59 | }
60 |
61 | public get hit() {
62 | return this._hit;
63 | }
64 | public get entity() {
65 | return this._entity;
66 | }
67 | public get coords() {
68 | return this._coords;
69 | }
70 | public get surfaceNormal() {
71 | return this._surfaceNormal;
72 | }
73 |
74 | public static getForwardVector(rotation: Vector3) {
75 | const rotationRadians = rotation.multiply(Math.PI / 180);
76 | return new Vector3(
77 | -Math.sin(rotationRadians.z) * Math.abs(Math.cos(rotationRadians.x)),
78 | Math.cos(rotationRadians.z) * Math.abs(Math.cos(rotationRadians.x)),
79 | Math.sin(rotationRadians.x)
80 | );
81 | }
82 |
83 | public getSurfaceRotation() {
84 | if (!this.surfaceNormal) throw new Error('No surface normal found');
85 |
86 | const upVector = new Vector3(0, 1, 0);
87 | const rotationAxis = upVector.crossProduct(this.surfaceNormal).normalize;
88 | const rotationAngle = Math.acos(upVector.dotProduct(this.surfaceNormal));
89 | const rotationVector = rotationAxis.multiply(rotationAngle);
90 |
91 | return rotationVector;
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/game/src/client/classes/NuiComms.ts:
--------------------------------------------------------------------------------
1 | import { type NUIComms } from '../../../../shared/types/nui-comms';
2 | import { Logger } from '../../shared/logger';
3 |
4 | const NUI_CALLBACK_NAME = 'request';
5 |
6 | type RequestHandler = (
7 | data: NUIComms.Request[T]['data']
8 | ) =>
9 | | NUIComms.Request[T]['response']
10 | | Promise
11 | | void;
12 |
13 | class NuiComms {
14 | private logger: Logger;
15 | private handlers: Partial<{
16 | [K in keyof NUIComms.Request]: RequestHandler;
17 | }>;
18 |
19 | private ready: boolean;
20 | private awaitingReadyResolvers: (() => void)[];
21 |
22 | constructor() {
23 | this.logger = new Logger('NuiActions');
24 | this.handlers = {};
25 | this.ready = false;
26 | this.awaitingReadyResolvers = [];
27 | }
28 |
29 | public init() {
30 | RegisterNuiCallbackType(NUI_CALLBACK_NAME);
31 | on(`__cfx_nui:${NUI_CALLBACK_NAME}`, this.handleRequest);
32 |
33 | const readyProm = new Promise(res => {
34 | this.register('ready', () => {
35 | this.ready = true;
36 | this.awaitingReadyResolvers.forEach(res => res());
37 | this.awaitingReadyResolvers = [];
38 | this.logger.info('Ready');
39 | res();
40 | });
41 | });
42 |
43 | return readyProm;
44 | }
45 |
46 | private handleRequest = async (
47 | data: { action: T; data: NUIComms.Request[T]['data'] },
48 | cb: (cb: NUIComms.Response) => void
49 | ) => {
50 | const handler = this.handlers[data.action];
51 | if (!handler) {
52 | cb({
53 | data: null,
54 | meta: {
55 | ok: false,
56 | message: `No requesthandler for ${data.action}`,
57 | },
58 | });
59 | return;
60 | }
61 |
62 | try {
63 | const result = await this.handlers[data.action]!(data.data);
64 | cb({ data: result ?? null, meta: { ok: true } });
65 | } catch (e: any) {
66 | cb({
67 | data: null,
68 | meta: { ok: false, message: e?.message ?? 'Unknown error' },
69 | });
70 | }
71 | };
72 |
73 | public send(
74 | action: T,
75 | data: NUIComms.Event[T]
76 | ) {
77 | if (!this.ready) {
78 | const awaitingReadyPromise = new Promise(res => {
79 | this.awaitingReadyResolvers.push(res);
80 | });
81 | awaitingReadyPromise.then(() => {
82 | this.send(action, data);
83 | });
84 | return;
85 | }
86 |
87 | SendNUIMessage({ action, data });
88 | }
89 |
90 | public register(
91 | name: T,
92 | cb: RequestHandler
93 | ) {
94 | if (this.handlers[name]) {
95 | this.logger.error(`Handler for "${String(name)}" already exists`);
96 | return;
97 | }
98 |
99 | // @ts-ignore - TS doesn't like this even though it's valid
100 | this.handlers[name] = cb;
101 | }
102 | }
103 |
104 | export const nuiComms = new NuiComms();
105 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@biomejs/biome@1.5.3":
6 | version "1.5.3"
7 | resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.5.3.tgz#0762b9f681c247a228522e6c506060e734809d48"
8 | integrity sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==
9 | optionalDependencies:
10 | "@biomejs/cli-darwin-arm64" "1.5.3"
11 | "@biomejs/cli-darwin-x64" "1.5.3"
12 | "@biomejs/cli-linux-arm64" "1.5.3"
13 | "@biomejs/cli-linux-arm64-musl" "1.5.3"
14 | "@biomejs/cli-linux-x64" "1.5.3"
15 | "@biomejs/cli-linux-x64-musl" "1.5.3"
16 | "@biomejs/cli-win32-arm64" "1.5.3"
17 | "@biomejs/cli-win32-x64" "1.5.3"
18 |
19 | "@biomejs/cli-darwin-arm64@1.5.3":
20 | version "1.5.3"
21 | resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.3.tgz#8df0a562ca59b7a77151e26f67f45074644fab1c"
22 | integrity sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==
23 |
24 | "@biomejs/cli-darwin-x64@1.5.3":
25 | version "1.5.3"
26 | resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz#ab5376f15d9e23b60ae2b0b51f7feee38a62bba2"
27 | integrity sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==
28 |
29 | "@biomejs/cli-linux-arm64-musl@1.5.3":
30 | version "1.5.3"
31 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz#a2ba748a6cf94e2288244294a8e36a7db153982f"
32 | integrity sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==
33 |
34 | "@biomejs/cli-linux-arm64@1.5.3":
35 | version "1.5.3"
36 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz#c805d48a4740cadd4fbdc22bf74d86b6e10ed84e"
37 | integrity sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==
38 |
39 | "@biomejs/cli-linux-x64-musl@1.5.3":
40 | version "1.5.3"
41 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz#b524a85e46724543eb0f3eda143dd62e58d6e148"
42 | integrity sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==
43 |
44 | "@biomejs/cli-linux-x64@1.5.3":
45 | version "1.5.3"
46 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz#3934339eac9ec14307cb73541158cbf1695bfb79"
47 | integrity sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==
48 |
49 | "@biomejs/cli-win32-arm64@1.5.3":
50 | version "1.5.3"
51 | resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz#db337fc521bd046015499d8bbc02835dbd93f01c"
52 | integrity sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==
53 |
54 | "@biomejs/cli-win32-x64@1.5.3":
55 | version "1.5.3"
56 | resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.3.tgz#1a424f26b709bc17fc592de18e8f48a6d2a44c86"
57 | integrity sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==
58 |
59 | typescript@^5.3.3:
60 | version "5.3.3"
61 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
62 | integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
63 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | devDependencies:
8 | '@biomejs/biome':
9 | specifier: 1.5.3
10 | version: 1.5.3
11 | typescript:
12 | specifier: 5.3.3
13 | version: 5.3.3
14 |
15 | packages:
16 |
17 | /@biomejs/biome@1.5.3:
18 | resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==}
19 | engines: {node: '>=14.*'}
20 | hasBin: true
21 | requiresBuild: true
22 | optionalDependencies:
23 | '@biomejs/cli-darwin-arm64': 1.5.3
24 | '@biomejs/cli-darwin-x64': 1.5.3
25 | '@biomejs/cli-linux-arm64': 1.5.3
26 | '@biomejs/cli-linux-arm64-musl': 1.5.3
27 | '@biomejs/cli-linux-x64': 1.5.3
28 | '@biomejs/cli-linux-x64-musl': 1.5.3
29 | '@biomejs/cli-win32-arm64': 1.5.3
30 | '@biomejs/cli-win32-x64': 1.5.3
31 | dev: true
32 |
33 | /@biomejs/cli-darwin-arm64@1.5.3:
34 | resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==}
35 | engines: {node: '>=14.*'}
36 | cpu: [arm64]
37 | os: [darwin]
38 | requiresBuild: true
39 | dev: true
40 | optional: true
41 |
42 | /@biomejs/cli-darwin-x64@1.5.3:
43 | resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==}
44 | engines: {node: '>=14.*'}
45 | cpu: [x64]
46 | os: [darwin]
47 | requiresBuild: true
48 | dev: true
49 | optional: true
50 |
51 | /@biomejs/cli-linux-arm64-musl@1.5.3:
52 | resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==}
53 | engines: {node: '>=14.*'}
54 | cpu: [arm64]
55 | os: [linux]
56 | requiresBuild: true
57 | dev: true
58 | optional: true
59 |
60 | /@biomejs/cli-linux-arm64@1.5.3:
61 | resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==}
62 | engines: {node: '>=14.*'}
63 | cpu: [arm64]
64 | os: [linux]
65 | requiresBuild: true
66 | dev: true
67 | optional: true
68 |
69 | /@biomejs/cli-linux-x64-musl@1.5.3:
70 | resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==}
71 | engines: {node: '>=14.*'}
72 | cpu: [x64]
73 | os: [linux]
74 | requiresBuild: true
75 | dev: true
76 | optional: true
77 |
78 | /@biomejs/cli-linux-x64@1.5.3:
79 | resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==}
80 | engines: {node: '>=14.*'}
81 | cpu: [x64]
82 | os: [linux]
83 | requiresBuild: true
84 | dev: true
85 | optional: true
86 |
87 | /@biomejs/cli-win32-arm64@1.5.3:
88 | resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==}
89 | engines: {node: '>=14.*'}
90 | cpu: [arm64]
91 | os: [win32]
92 | requiresBuild: true
93 | dev: true
94 | optional: true
95 |
96 | /@biomejs/cli-win32-x64@1.5.3:
97 | resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==}
98 | engines: {node: '>=14.*'}
99 | cpu: [x64]
100 | os: [win32]
101 | requiresBuild: true
102 | dev: true
103 | optional: true
104 |
105 | /typescript@5.3.3:
106 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
107 | engines: {node: '>=14.17'}
108 | hasBin: true
109 | dev: true
110 |
--------------------------------------------------------------------------------
/game/src/shared/vector3.ts:
--------------------------------------------------------------------------------
1 | import { Vec3 } from '@shared/types/util';
2 |
3 | export class Vector3 implements Vec3 {
4 | public static create(v1: number | Vec3 | number[]): Vector3 {
5 | if (typeof v1 === 'number') {
6 | return new Vector3(v1, v1, v1);
7 | }
8 | if (Array.isArray(v1)) {
9 | return new Vector3(v1[0], v1[1], v1[2]);
10 | }
11 | return new Vector3(v1.x, v1.y, v1.z);
12 | }
13 |
14 | public static clone(v1: Vec3): Vector3 {
15 | return Vector3.create(v1);
16 | }
17 |
18 | public static add(v1: Vec3, v2: number | Vec3): Vector3 {
19 | if (typeof v2 === 'number') {
20 | return new Vector3(v1.x + v2, v1.y + v2, v1.z + v2);
21 | }
22 | return new Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
23 | }
24 |
25 | public static subtract(v1: Vec3, v2: Vec3): Vector3 {
26 | return new Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
27 | }
28 |
29 | public static multiply(v1: Vec3, v2: Vec3 | number): Vector3 {
30 | if (typeof v2 === 'number') {
31 | return new Vector3(v1.x * v2, v1.y * v2, v1.z * v2);
32 | }
33 | return new Vector3(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);
34 | }
35 |
36 | public static divide(v1: Vec3, v2: Vec3 | number): Vector3 {
37 | if (typeof v2 === 'number') {
38 | return new Vector3(v1.x / v2, v1.y / v2, v1.z / v2);
39 | }
40 | return new Vector3(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);
41 | }
42 |
43 | public static dotProduct(v1: Vec3, v2: Vec3): number {
44 | return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
45 | }
46 |
47 | public static crossProduct(v1: Vec3, v2: Vec3): Vector3 {
48 | const x = v1.y * v2.z - v1.z * v2.y;
49 | const y = v1.z * v2.x - v1.x * v2.z;
50 | const z = v1.x * v2.y - v1.y * v2.x;
51 | return new Vector3(x, y, z);
52 | }
53 |
54 | public static normalize(v: Vector3): Vector3 {
55 | return Vector3.divide(v, v.Length);
56 | }
57 |
58 | public static isSame(v1: Vec3, v2: Vec3): boolean {
59 | return v1.x === v2.x && v1.y === v2.y && v1.z === v2.z;
60 | }
61 |
62 | constructor(public x: number, public y: number, public z: number) {
63 | this.x = x ?? 0;
64 | this.y = y ?? 0;
65 | this.z = z ?? 0;
66 | }
67 |
68 | public clone(): Vector3 {
69 | return new Vector3(this.x, this.y, this.z);
70 | }
71 |
72 | /**
73 | * The product of the Euclidean magnitudes of this and another Vector3.
74 | *
75 | * @param v Vector3 to find Euclidean magnitude between.
76 | * @returns Euclidean magnitude with another vector.
77 | */
78 | public distanceSquared(v: Vec3): number {
79 | const w: Vector3 = this.subtract(v);
80 | return Vector3.dotProduct(w, w);
81 | }
82 |
83 | /**
84 | * The distance between two Vectors.
85 | *
86 | * @param v Vector3 to find distance between.
87 | * @returns Distance between this and another vector.
88 | */
89 | public distance(v: Vec3): number {
90 | return Math.sqrt(this.distanceSquared(v));
91 | }
92 |
93 | public get normalize(): Vector3 {
94 | return Vector3.normalize(this);
95 | }
96 |
97 | public crossProduct(v: Vec3): Vector3 {
98 | return Vector3.crossProduct(this, v);
99 | }
100 |
101 | public dotProduct(v: Vec3): number {
102 | return Vector3.dotProduct(this, v);
103 | }
104 |
105 | public add(v: number | Vec3): Vec3 {
106 | return Vector3.add(this, v);
107 | }
108 |
109 | public subtract(v: Vec3): Vector3 {
110 | return Vector3.subtract(this, v);
111 | }
112 |
113 | public multiply(v: number | Vec3): Vector3 {
114 | return Vector3.multiply(this, v);
115 | }
116 |
117 | public divide(v: number | Vec3): Vec3 {
118 | return Vector3.divide(this, v);
119 | }
120 |
121 | public replace(v: Vec3): void {
122 | this.x = v.x;
123 | this.y = v.y;
124 | this.z = v.z;
125 | }
126 |
127 | public get Length(): number {
128 | return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/game/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | devDependencies:
8 | '@citizenfx/client':
9 | specifier: 2.0.7345-1
10 | version: 2.0.7345-1
11 | '@citizenfx/server':
12 | specifier: 2.0.7345-1
13 | version: 2.0.7345-1
14 | '@types/node':
15 | specifier: ^20.11.6
16 | version: 20.11.6
17 | esbuild:
18 | specifier: ^0.19.12
19 | version: 0.19.12
20 | typescript:
21 | specifier: 5.3.3
22 | version: 5.3.3
23 |
24 | packages:
25 |
26 | /@citizenfx/client@2.0.7345-1:
27 | resolution: {integrity: sha512-5rLAmgpAZEq5xt9rwXa1GaR7FgHl8+c8oM23FK16LhfBly5/h6AviKW6PNJN6RAW+hHP1H184zX1JvClTVIFqw==}
28 | dev: true
29 |
30 | /@citizenfx/server@2.0.7345-1:
31 | resolution: {integrity: sha512-PQnY8wxm6AHgmgB7T/vvSDg4TUtyUovgD25GabaaKxohNU8hWs3SQmdO1FPeLtBk0aPBbmAIH5Yg9vw84Eev2A==}
32 | dev: true
33 |
34 | /@esbuild/aix-ppc64@0.19.12:
35 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
36 | engines: {node: '>=12'}
37 | cpu: [ppc64]
38 | os: [aix]
39 | requiresBuild: true
40 | dev: true
41 | optional: true
42 |
43 | /@esbuild/android-arm64@0.19.12:
44 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
45 | engines: {node: '>=12'}
46 | cpu: [arm64]
47 | os: [android]
48 | requiresBuild: true
49 | dev: true
50 | optional: true
51 |
52 | /@esbuild/android-arm@0.19.12:
53 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
54 | engines: {node: '>=12'}
55 | cpu: [arm]
56 | os: [android]
57 | requiresBuild: true
58 | dev: true
59 | optional: true
60 |
61 | /@esbuild/android-x64@0.19.12:
62 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
63 | engines: {node: '>=12'}
64 | cpu: [x64]
65 | os: [android]
66 | requiresBuild: true
67 | dev: true
68 | optional: true
69 |
70 | /@esbuild/darwin-arm64@0.19.12:
71 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
72 | engines: {node: '>=12'}
73 | cpu: [arm64]
74 | os: [darwin]
75 | requiresBuild: true
76 | dev: true
77 | optional: true
78 |
79 | /@esbuild/darwin-x64@0.19.12:
80 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
81 | engines: {node: '>=12'}
82 | cpu: [x64]
83 | os: [darwin]
84 | requiresBuild: true
85 | dev: true
86 | optional: true
87 |
88 | /@esbuild/freebsd-arm64@0.19.12:
89 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
90 | engines: {node: '>=12'}
91 | cpu: [arm64]
92 | os: [freebsd]
93 | requiresBuild: true
94 | dev: true
95 | optional: true
96 |
97 | /@esbuild/freebsd-x64@0.19.12:
98 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
99 | engines: {node: '>=12'}
100 | cpu: [x64]
101 | os: [freebsd]
102 | requiresBuild: true
103 | dev: true
104 | optional: true
105 |
106 | /@esbuild/linux-arm64@0.19.12:
107 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
108 | engines: {node: '>=12'}
109 | cpu: [arm64]
110 | os: [linux]
111 | requiresBuild: true
112 | dev: true
113 | optional: true
114 |
115 | /@esbuild/linux-arm@0.19.12:
116 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
117 | engines: {node: '>=12'}
118 | cpu: [arm]
119 | os: [linux]
120 | requiresBuild: true
121 | dev: true
122 | optional: true
123 |
124 | /@esbuild/linux-ia32@0.19.12:
125 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
126 | engines: {node: '>=12'}
127 | cpu: [ia32]
128 | os: [linux]
129 | requiresBuild: true
130 | dev: true
131 | optional: true
132 |
133 | /@esbuild/linux-loong64@0.19.12:
134 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
135 | engines: {node: '>=12'}
136 | cpu: [loong64]
137 | os: [linux]
138 | requiresBuild: true
139 | dev: true
140 | optional: true
141 |
142 | /@esbuild/linux-mips64el@0.19.12:
143 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
144 | engines: {node: '>=12'}
145 | cpu: [mips64el]
146 | os: [linux]
147 | requiresBuild: true
148 | dev: true
149 | optional: true
150 |
151 | /@esbuild/linux-ppc64@0.19.12:
152 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
153 | engines: {node: '>=12'}
154 | cpu: [ppc64]
155 | os: [linux]
156 | requiresBuild: true
157 | dev: true
158 | optional: true
159 |
160 | /@esbuild/linux-riscv64@0.19.12:
161 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
162 | engines: {node: '>=12'}
163 | cpu: [riscv64]
164 | os: [linux]
165 | requiresBuild: true
166 | dev: true
167 | optional: true
168 |
169 | /@esbuild/linux-s390x@0.19.12:
170 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
171 | engines: {node: '>=12'}
172 | cpu: [s390x]
173 | os: [linux]
174 | requiresBuild: true
175 | dev: true
176 | optional: true
177 |
178 | /@esbuild/linux-x64@0.19.12:
179 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
180 | engines: {node: '>=12'}
181 | cpu: [x64]
182 | os: [linux]
183 | requiresBuild: true
184 | dev: true
185 | optional: true
186 |
187 | /@esbuild/netbsd-x64@0.19.12:
188 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
189 | engines: {node: '>=12'}
190 | cpu: [x64]
191 | os: [netbsd]
192 | requiresBuild: true
193 | dev: true
194 | optional: true
195 |
196 | /@esbuild/openbsd-x64@0.19.12:
197 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
198 | engines: {node: '>=12'}
199 | cpu: [x64]
200 | os: [openbsd]
201 | requiresBuild: true
202 | dev: true
203 | optional: true
204 |
205 | /@esbuild/sunos-x64@0.19.12:
206 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
207 | engines: {node: '>=12'}
208 | cpu: [x64]
209 | os: [sunos]
210 | requiresBuild: true
211 | dev: true
212 | optional: true
213 |
214 | /@esbuild/win32-arm64@0.19.12:
215 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
216 | engines: {node: '>=12'}
217 | cpu: [arm64]
218 | os: [win32]
219 | requiresBuild: true
220 | dev: true
221 | optional: true
222 |
223 | /@esbuild/win32-ia32@0.19.12:
224 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
225 | engines: {node: '>=12'}
226 | cpu: [ia32]
227 | os: [win32]
228 | requiresBuild: true
229 | dev: true
230 | optional: true
231 |
232 | /@esbuild/win32-x64@0.19.12:
233 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
234 | engines: {node: '>=12'}
235 | cpu: [x64]
236 | os: [win32]
237 | requiresBuild: true
238 | dev: true
239 | optional: true
240 |
241 | /@types/node@20.11.6:
242 | resolution: {integrity: sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==}
243 | dependencies:
244 | undici-types: 5.26.5
245 | dev: true
246 |
247 | /esbuild@0.19.12:
248 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
249 | engines: {node: '>=12'}
250 | hasBin: true
251 | requiresBuild: true
252 | optionalDependencies:
253 | '@esbuild/aix-ppc64': 0.19.12
254 | '@esbuild/android-arm': 0.19.12
255 | '@esbuild/android-arm64': 0.19.12
256 | '@esbuild/android-x64': 0.19.12
257 | '@esbuild/darwin-arm64': 0.19.12
258 | '@esbuild/darwin-x64': 0.19.12
259 | '@esbuild/freebsd-arm64': 0.19.12
260 | '@esbuild/freebsd-x64': 0.19.12
261 | '@esbuild/linux-arm': 0.19.12
262 | '@esbuild/linux-arm64': 0.19.12
263 | '@esbuild/linux-ia32': 0.19.12
264 | '@esbuild/linux-loong64': 0.19.12
265 | '@esbuild/linux-mips64el': 0.19.12
266 | '@esbuild/linux-ppc64': 0.19.12
267 | '@esbuild/linux-riscv64': 0.19.12
268 | '@esbuild/linux-s390x': 0.19.12
269 | '@esbuild/linux-x64': 0.19.12
270 | '@esbuild/netbsd-x64': 0.19.12
271 | '@esbuild/openbsd-x64': 0.19.12
272 | '@esbuild/sunos-x64': 0.19.12
273 | '@esbuild/win32-arm64': 0.19.12
274 | '@esbuild/win32-ia32': 0.19.12
275 | '@esbuild/win32-x64': 0.19.12
276 | dev: true
277 |
278 | /typescript@5.3.3:
279 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
280 | engines: {node: '>=14.17'}
281 | hasBin: true
282 | dev: true
283 |
284 | /undici-types@5.26.5:
285 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
286 | dev: true
287 |
--------------------------------------------------------------------------------
/ui/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | dependencies:
8 | '@react-three/drei':
9 | specifier: ^9.96.5
10 | version: 9.96.5(@react-three/fiber@8.15.15)(@types/react@18.2.48)(@types/three@0.160.0)(react-dom@18.2.0)(react@18.2.0)(three@0.160.1)
11 | '@react-three/fiber':
12 | specifier: ^8.15.15
13 | version: 8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1)
14 | '@uidotdev/usehooks':
15 | specifier: ^2.4.1
16 | version: 2.4.1(react-dom@18.2.0)(react@18.2.0)
17 | react:
18 | specifier: ^18.2.0
19 | version: 18.2.0
20 | react-dom:
21 | specifier: ^18.2.0
22 | version: 18.2.0(react@18.2.0)
23 | sass:
24 | specifier: ^1.70.0
25 | version: 1.70.0
26 | three:
27 | specifier: ^0.160.1
28 | version: 0.160.1
29 |
30 | devDependencies:
31 | '@types/react':
32 | specifier: ^18.2.43
33 | version: 18.2.48
34 | '@types/react-dom':
35 | specifier: ^18.2.17
36 | version: 18.2.18
37 | '@types/three':
38 | specifier: ^0.160.0
39 | version: 0.160.0
40 | '@typescript-eslint/eslint-plugin':
41 | specifier: ^6.14.0
42 | version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3)
43 | '@typescript-eslint/parser':
44 | specifier: ^6.14.0
45 | version: 6.19.1(eslint@8.56.0)(typescript@5.3.3)
46 | '@vitejs/plugin-react-swc':
47 | specifier: ^3.5.0
48 | version: 3.5.0(vite@5.0.12)
49 | typescript:
50 | specifier: ^5.2.2
51 | version: 5.3.3
52 | vite:
53 | specifier: ^5.0.8
54 | version: 5.0.12(sass@1.70.0)
55 |
56 | packages:
57 |
58 | /@aashutoshrathi/word-wrap@1.2.6:
59 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
60 | engines: {node: '>=0.10.0'}
61 | dev: true
62 |
63 | /@babel/runtime@7.23.9:
64 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==}
65 | engines: {node: '>=6.9.0'}
66 | dependencies:
67 | regenerator-runtime: 0.14.1
68 | dev: false
69 |
70 | /@esbuild/aix-ppc64@0.19.12:
71 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
72 | engines: {node: '>=12'}
73 | cpu: [ppc64]
74 | os: [aix]
75 | requiresBuild: true
76 | dev: true
77 | optional: true
78 |
79 | /@esbuild/android-arm64@0.19.12:
80 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
81 | engines: {node: '>=12'}
82 | cpu: [arm64]
83 | os: [android]
84 | requiresBuild: true
85 | dev: true
86 | optional: true
87 |
88 | /@esbuild/android-arm@0.19.12:
89 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
90 | engines: {node: '>=12'}
91 | cpu: [arm]
92 | os: [android]
93 | requiresBuild: true
94 | dev: true
95 | optional: true
96 |
97 | /@esbuild/android-x64@0.19.12:
98 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
99 | engines: {node: '>=12'}
100 | cpu: [x64]
101 | os: [android]
102 | requiresBuild: true
103 | dev: true
104 | optional: true
105 |
106 | /@esbuild/darwin-arm64@0.19.12:
107 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
108 | engines: {node: '>=12'}
109 | cpu: [arm64]
110 | os: [darwin]
111 | requiresBuild: true
112 | dev: true
113 | optional: true
114 |
115 | /@esbuild/darwin-x64@0.19.12:
116 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
117 | engines: {node: '>=12'}
118 | cpu: [x64]
119 | os: [darwin]
120 | requiresBuild: true
121 | dev: true
122 | optional: true
123 |
124 | /@esbuild/freebsd-arm64@0.19.12:
125 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
126 | engines: {node: '>=12'}
127 | cpu: [arm64]
128 | os: [freebsd]
129 | requiresBuild: true
130 | dev: true
131 | optional: true
132 |
133 | /@esbuild/freebsd-x64@0.19.12:
134 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
135 | engines: {node: '>=12'}
136 | cpu: [x64]
137 | os: [freebsd]
138 | requiresBuild: true
139 | dev: true
140 | optional: true
141 |
142 | /@esbuild/linux-arm64@0.19.12:
143 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
144 | engines: {node: '>=12'}
145 | cpu: [arm64]
146 | os: [linux]
147 | requiresBuild: true
148 | dev: true
149 | optional: true
150 |
151 | /@esbuild/linux-arm@0.19.12:
152 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
153 | engines: {node: '>=12'}
154 | cpu: [arm]
155 | os: [linux]
156 | requiresBuild: true
157 | dev: true
158 | optional: true
159 |
160 | /@esbuild/linux-ia32@0.19.12:
161 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
162 | engines: {node: '>=12'}
163 | cpu: [ia32]
164 | os: [linux]
165 | requiresBuild: true
166 | dev: true
167 | optional: true
168 |
169 | /@esbuild/linux-loong64@0.19.12:
170 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
171 | engines: {node: '>=12'}
172 | cpu: [loong64]
173 | os: [linux]
174 | requiresBuild: true
175 | dev: true
176 | optional: true
177 |
178 | /@esbuild/linux-mips64el@0.19.12:
179 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
180 | engines: {node: '>=12'}
181 | cpu: [mips64el]
182 | os: [linux]
183 | requiresBuild: true
184 | dev: true
185 | optional: true
186 |
187 | /@esbuild/linux-ppc64@0.19.12:
188 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
189 | engines: {node: '>=12'}
190 | cpu: [ppc64]
191 | os: [linux]
192 | requiresBuild: true
193 | dev: true
194 | optional: true
195 |
196 | /@esbuild/linux-riscv64@0.19.12:
197 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
198 | engines: {node: '>=12'}
199 | cpu: [riscv64]
200 | os: [linux]
201 | requiresBuild: true
202 | dev: true
203 | optional: true
204 |
205 | /@esbuild/linux-s390x@0.19.12:
206 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
207 | engines: {node: '>=12'}
208 | cpu: [s390x]
209 | os: [linux]
210 | requiresBuild: true
211 | dev: true
212 | optional: true
213 |
214 | /@esbuild/linux-x64@0.19.12:
215 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
216 | engines: {node: '>=12'}
217 | cpu: [x64]
218 | os: [linux]
219 | requiresBuild: true
220 | dev: true
221 | optional: true
222 |
223 | /@esbuild/netbsd-x64@0.19.12:
224 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
225 | engines: {node: '>=12'}
226 | cpu: [x64]
227 | os: [netbsd]
228 | requiresBuild: true
229 | dev: true
230 | optional: true
231 |
232 | /@esbuild/openbsd-x64@0.19.12:
233 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
234 | engines: {node: '>=12'}
235 | cpu: [x64]
236 | os: [openbsd]
237 | requiresBuild: true
238 | dev: true
239 | optional: true
240 |
241 | /@esbuild/sunos-x64@0.19.12:
242 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
243 | engines: {node: '>=12'}
244 | cpu: [x64]
245 | os: [sunos]
246 | requiresBuild: true
247 | dev: true
248 | optional: true
249 |
250 | /@esbuild/win32-arm64@0.19.12:
251 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
252 | engines: {node: '>=12'}
253 | cpu: [arm64]
254 | os: [win32]
255 | requiresBuild: true
256 | dev: true
257 | optional: true
258 |
259 | /@esbuild/win32-ia32@0.19.12:
260 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
261 | engines: {node: '>=12'}
262 | cpu: [ia32]
263 | os: [win32]
264 | requiresBuild: true
265 | dev: true
266 | optional: true
267 |
268 | /@esbuild/win32-x64@0.19.12:
269 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
270 | engines: {node: '>=12'}
271 | cpu: [x64]
272 | os: [win32]
273 | requiresBuild: true
274 | dev: true
275 | optional: true
276 |
277 | /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
278 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
279 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
280 | peerDependencies:
281 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
282 | dependencies:
283 | eslint: 8.56.0
284 | eslint-visitor-keys: 3.4.3
285 | dev: true
286 |
287 | /@eslint-community/regexpp@4.10.0:
288 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
289 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
290 | dev: true
291 |
292 | /@eslint/eslintrc@2.1.4:
293 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
294 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
295 | dependencies:
296 | ajv: 6.12.6
297 | debug: 4.3.4
298 | espree: 9.6.1
299 | globals: 13.24.0
300 | ignore: 5.3.0
301 | import-fresh: 3.3.0
302 | js-yaml: 4.1.0
303 | minimatch: 3.1.2
304 | strip-json-comments: 3.1.1
305 | transitivePeerDependencies:
306 | - supports-color
307 | dev: true
308 |
309 | /@eslint/js@8.56.0:
310 | resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
311 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
312 | dev: true
313 |
314 | /@humanwhocodes/config-array@0.11.14:
315 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
316 | engines: {node: '>=10.10.0'}
317 | dependencies:
318 | '@humanwhocodes/object-schema': 2.0.2
319 | debug: 4.3.4
320 | minimatch: 3.1.2
321 | transitivePeerDependencies:
322 | - supports-color
323 | dev: true
324 |
325 | /@humanwhocodes/module-importer@1.0.1:
326 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
327 | engines: {node: '>=12.22'}
328 | dev: true
329 |
330 | /@humanwhocodes/object-schema@2.0.2:
331 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
332 | dev: true
333 |
334 | /@mediapipe/tasks-vision@0.10.8:
335 | resolution: {integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==}
336 | dev: false
337 |
338 | /@nodelib/fs.scandir@2.1.5:
339 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
340 | engines: {node: '>= 8'}
341 | dependencies:
342 | '@nodelib/fs.stat': 2.0.5
343 | run-parallel: 1.2.0
344 | dev: true
345 |
346 | /@nodelib/fs.stat@2.0.5:
347 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
348 | engines: {node: '>= 8'}
349 | dev: true
350 |
351 | /@nodelib/fs.walk@1.2.8:
352 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
353 | engines: {node: '>= 8'}
354 | dependencies:
355 | '@nodelib/fs.scandir': 2.1.5
356 | fastq: 1.16.0
357 | dev: true
358 |
359 | /@react-spring/animated@9.6.1(react@18.2.0):
360 | resolution: {integrity: sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==}
361 | peerDependencies:
362 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
363 | dependencies:
364 | '@react-spring/shared': 9.6.1(react@18.2.0)
365 | '@react-spring/types': 9.6.1
366 | react: 18.2.0
367 | dev: false
368 |
369 | /@react-spring/core@9.6.1(react@18.2.0):
370 | resolution: {integrity: sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==}
371 | peerDependencies:
372 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
373 | dependencies:
374 | '@react-spring/animated': 9.6.1(react@18.2.0)
375 | '@react-spring/rafz': 9.6.1
376 | '@react-spring/shared': 9.6.1(react@18.2.0)
377 | '@react-spring/types': 9.6.1
378 | react: 18.2.0
379 | dev: false
380 |
381 | /@react-spring/rafz@9.6.1:
382 | resolution: {integrity: sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==}
383 | dev: false
384 |
385 | /@react-spring/shared@9.6.1(react@18.2.0):
386 | resolution: {integrity: sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==}
387 | peerDependencies:
388 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
389 | dependencies:
390 | '@react-spring/rafz': 9.6.1
391 | '@react-spring/types': 9.6.1
392 | react: 18.2.0
393 | dev: false
394 |
395 | /@react-spring/three@9.6.1(@react-three/fiber@8.15.15)(react@18.2.0)(three@0.160.1):
396 | resolution: {integrity: sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==}
397 | peerDependencies:
398 | '@react-three/fiber': '>=6.0'
399 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
400 | three: '>=0.126'
401 | dependencies:
402 | '@react-spring/animated': 9.6.1(react@18.2.0)
403 | '@react-spring/core': 9.6.1(react@18.2.0)
404 | '@react-spring/shared': 9.6.1(react@18.2.0)
405 | '@react-spring/types': 9.6.1
406 | '@react-three/fiber': 8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1)
407 | react: 18.2.0
408 | three: 0.160.1
409 | dev: false
410 |
411 | /@react-spring/types@9.6.1:
412 | resolution: {integrity: sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==}
413 | dev: false
414 |
415 | /@react-three/drei@9.96.5(@react-three/fiber@8.15.15)(@types/react@18.2.48)(@types/three@0.160.0)(react-dom@18.2.0)(react@18.2.0)(three@0.160.1):
416 | resolution: {integrity: sha512-mEf8y8S0FCdCryfbKJ1vghYzMgI+7bgssEeerBBwCk4pi7h8OeavWISXb7QzY9dQLbPm5lL/X0PC7qLE6VUKww==}
417 | peerDependencies:
418 | '@react-three/fiber': '>=8.0'
419 | react: '>=18.0'
420 | react-dom: '>=18.0'
421 | three: '>=0.137'
422 | peerDependenciesMeta:
423 | react-dom:
424 | optional: true
425 | dependencies:
426 | '@babel/runtime': 7.23.9
427 | '@mediapipe/tasks-vision': 0.10.8
428 | '@react-spring/three': 9.6.1(@react-three/fiber@8.15.15)(react@18.2.0)(three@0.160.1)
429 | '@react-three/fiber': 8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1)
430 | '@use-gesture/react': 10.3.0(react@18.2.0)
431 | camera-controls: 2.7.3(three@0.160.1)
432 | cross-env: 7.0.3
433 | detect-gpu: 5.0.37
434 | glsl-noise: 0.0.0
435 | maath: 0.10.7(@types/three@0.160.0)(three@0.160.1)
436 | meshline: 3.1.7(three@0.160.1)
437 | react: 18.2.0
438 | react-composer: 5.0.3(react@18.2.0)
439 | react-dom: 18.2.0(react@18.2.0)
440 | react-merge-refs: 1.1.0
441 | stats-gl: 2.0.1
442 | stats.js: 0.17.0
443 | suspend-react: 0.1.3(react@18.2.0)
444 | three: 0.160.1
445 | three-mesh-bvh: 0.7.0(three@0.160.1)
446 | three-stdlib: 2.29.4(three@0.160.1)
447 | troika-three-text: 0.47.2(three@0.160.1)
448 | tunnel-rat: 0.1.2(@types/react@18.2.48)(react@18.2.0)
449 | utility-types: 3.11.0
450 | uuid: 9.0.1
451 | zustand: 3.7.2(react@18.2.0)
452 | transitivePeerDependencies:
453 | - '@types/react'
454 | - '@types/three'
455 | - immer
456 | dev: false
457 |
458 | /@react-three/fiber@8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1):
459 | resolution: {integrity: sha512-Z5POnzgpYxrgnYuiCv+8t7lpynEcGcn0/323kV1NtE7Cwq16aMqEuC6nF2Y/tK+crJpKNEqsRtvng/eJy0xxOA==}
460 | peerDependencies:
461 | expo: '>=43.0'
462 | expo-asset: '>=8.4'
463 | expo-file-system: '>=11.0'
464 | expo-gl: '>=11.0'
465 | react: '>=18.0'
466 | react-dom: '>=18.0'
467 | react-native: '>=0.64'
468 | three: '>=0.133'
469 | peerDependenciesMeta:
470 | expo:
471 | optional: true
472 | expo-asset:
473 | optional: true
474 | expo-file-system:
475 | optional: true
476 | expo-gl:
477 | optional: true
478 | react-dom:
479 | optional: true
480 | react-native:
481 | optional: true
482 | dependencies:
483 | '@babel/runtime': 7.23.9
484 | '@types/react-reconciler': 0.26.7
485 | '@types/webxr': 0.5.11
486 | base64-js: 1.5.1
487 | buffer: 6.0.3
488 | its-fine: 1.1.1(react@18.2.0)
489 | react: 18.2.0
490 | react-dom: 18.2.0(react@18.2.0)
491 | react-reconciler: 0.27.0(react@18.2.0)
492 | react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0)
493 | scheduler: 0.21.0
494 | suspend-react: 0.1.3(react@18.2.0)
495 | three: 0.160.1
496 | zustand: 3.7.2(react@18.2.0)
497 | dev: false
498 |
499 | /@rollup/rollup-android-arm-eabi@4.9.6:
500 | resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==}
501 | cpu: [arm]
502 | os: [android]
503 | requiresBuild: true
504 | dev: true
505 | optional: true
506 |
507 | /@rollup/rollup-android-arm64@4.9.6:
508 | resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==}
509 | cpu: [arm64]
510 | os: [android]
511 | requiresBuild: true
512 | dev: true
513 | optional: true
514 |
515 | /@rollup/rollup-darwin-arm64@4.9.6:
516 | resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==}
517 | cpu: [arm64]
518 | os: [darwin]
519 | requiresBuild: true
520 | dev: true
521 | optional: true
522 |
523 | /@rollup/rollup-darwin-x64@4.9.6:
524 | resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==}
525 | cpu: [x64]
526 | os: [darwin]
527 | requiresBuild: true
528 | dev: true
529 | optional: true
530 |
531 | /@rollup/rollup-linux-arm-gnueabihf@4.9.6:
532 | resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==}
533 | cpu: [arm]
534 | os: [linux]
535 | requiresBuild: true
536 | dev: true
537 | optional: true
538 |
539 | /@rollup/rollup-linux-arm64-gnu@4.9.6:
540 | resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==}
541 | cpu: [arm64]
542 | os: [linux]
543 | requiresBuild: true
544 | dev: true
545 | optional: true
546 |
547 | /@rollup/rollup-linux-arm64-musl@4.9.6:
548 | resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==}
549 | cpu: [arm64]
550 | os: [linux]
551 | requiresBuild: true
552 | dev: true
553 | optional: true
554 |
555 | /@rollup/rollup-linux-riscv64-gnu@4.9.6:
556 | resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==}
557 | cpu: [riscv64]
558 | os: [linux]
559 | requiresBuild: true
560 | dev: true
561 | optional: true
562 |
563 | /@rollup/rollup-linux-x64-gnu@4.9.6:
564 | resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==}
565 | cpu: [x64]
566 | os: [linux]
567 | requiresBuild: true
568 | dev: true
569 | optional: true
570 |
571 | /@rollup/rollup-linux-x64-musl@4.9.6:
572 | resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==}
573 | cpu: [x64]
574 | os: [linux]
575 | requiresBuild: true
576 | dev: true
577 | optional: true
578 |
579 | /@rollup/rollup-win32-arm64-msvc@4.9.6:
580 | resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==}
581 | cpu: [arm64]
582 | os: [win32]
583 | requiresBuild: true
584 | dev: true
585 | optional: true
586 |
587 | /@rollup/rollup-win32-ia32-msvc@4.9.6:
588 | resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==}
589 | cpu: [ia32]
590 | os: [win32]
591 | requiresBuild: true
592 | dev: true
593 | optional: true
594 |
595 | /@rollup/rollup-win32-x64-msvc@4.9.6:
596 | resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==}
597 | cpu: [x64]
598 | os: [win32]
599 | requiresBuild: true
600 | dev: true
601 | optional: true
602 |
603 | /@swc/core-darwin-arm64@1.3.105:
604 | resolution: {integrity: sha512-buWeweLVDXXmcnfIemH4PGnpjwsDTUGitnPchdftb0u1FU8zSSP/lw/pUCBDG/XvWAp7c/aFxgN4CyG0j7eayA==}
605 | engines: {node: '>=10'}
606 | cpu: [arm64]
607 | os: [darwin]
608 | requiresBuild: true
609 | dev: true
610 | optional: true
611 |
612 | /@swc/core-darwin-x64@1.3.105:
613 | resolution: {integrity: sha512-hFmXPApqjA/8sy/9NpljHVaKi1OvL9QkJ2MbbTCCbJERuHMpMUeMBUWipHRfepGHFhU+9B9zkEup/qJaJR4XIg==}
614 | engines: {node: '>=10'}
615 | cpu: [x64]
616 | os: [darwin]
617 | requiresBuild: true
618 | dev: true
619 | optional: true
620 |
621 | /@swc/core-linux-arm-gnueabihf@1.3.105:
622 | resolution: {integrity: sha512-mwXyMC41oMKkKrPpL8uJpOxw7fyfQoVtIw3Y5p0Blabk+espNYqix0E8VymHdRKuLmM//z5wVmMsuHdGBHvZeg==}
623 | engines: {node: '>=10'}
624 | cpu: [arm]
625 | os: [linux]
626 | requiresBuild: true
627 | dev: true
628 | optional: true
629 |
630 | /@swc/core-linux-arm64-gnu@1.3.105:
631 | resolution: {integrity: sha512-H7yEIVydnUtqBSUxwmO6vpIQn7j+Rr0DF6ZOORPyd/SFzQJK9cJRtmJQ3ZMzlJ1Bb+1gr3MvjgLEnmyCYEm2Hg==}
632 | engines: {node: '>=10'}
633 | cpu: [arm64]
634 | os: [linux]
635 | requiresBuild: true
636 | dev: true
637 | optional: true
638 |
639 | /@swc/core-linux-arm64-musl@1.3.105:
640 | resolution: {integrity: sha512-Jg7RTFT3pGFdGt5elPV6oDkinRy7q9cXpenjXnJnM2uvx3jOwnsAhexPyCDHom8SHL0j+9kaLLC66T3Gz1E4UA==}
641 | engines: {node: '>=10'}
642 | cpu: [arm64]
643 | os: [linux]
644 | requiresBuild: true
645 | dev: true
646 | optional: true
647 |
648 | /@swc/core-linux-x64-gnu@1.3.105:
649 | resolution: {integrity: sha512-DJghplpyusAmp1X5pW/y93MmS/u83Sx5GrpJxI6KLPa82+NItTgMcl8KBQmW5GYAJpVKZyaIvBanS5TdR8aN2w==}
650 | engines: {node: '>=10'}
651 | cpu: [x64]
652 | os: [linux]
653 | requiresBuild: true
654 | dev: true
655 | optional: true
656 |
657 | /@swc/core-linux-x64-musl@1.3.105:
658 | resolution: {integrity: sha512-wD5jL2dZH/5nPNssBo6jhOvkI0lmWnVR4vnOXWjuXgjq1S0AJpO5jdre/6pYLmf26hft3M42bteDnjR4AAZ38w==}
659 | engines: {node: '>=10'}
660 | cpu: [x64]
661 | os: [linux]
662 | requiresBuild: true
663 | dev: true
664 | optional: true
665 |
666 | /@swc/core-win32-arm64-msvc@1.3.105:
667 | resolution: {integrity: sha512-UqJtwILUHRw2+3UTPnRkZrzM/bGdQtbR4UFdp79mZQYfryeOUVNg7aJj/bWUTkKtLiZ3o+FBNrM/x2X1mJX5bA==}
668 | engines: {node: '>=10'}
669 | cpu: [arm64]
670 | os: [win32]
671 | requiresBuild: true
672 | dev: true
673 | optional: true
674 |
675 | /@swc/core-win32-ia32-msvc@1.3.105:
676 | resolution: {integrity: sha512-Z95C6vZgBEJ1snidYyjVKnVWiy/ZpPiIFIXGWkDr4ZyBgL3eZX12M6LzZ+NApHKffrbO4enbFyFomueBQgS2oA==}
677 | engines: {node: '>=10'}
678 | cpu: [ia32]
679 | os: [win32]
680 | requiresBuild: true
681 | dev: true
682 | optional: true
683 |
684 | /@swc/core-win32-x64-msvc@1.3.105:
685 | resolution: {integrity: sha512-3J8fkyDPFsS3mszuYUY4Wfk7/B2oio9qXUwF3DzOs2MK+XgdyMLIptIxL7gdfitXJBH8k39uVjrIw1JGJDjyFA==}
686 | engines: {node: '>=10'}
687 | cpu: [x64]
688 | os: [win32]
689 | requiresBuild: true
690 | dev: true
691 | optional: true
692 |
693 | /@swc/core@1.3.105:
694 | resolution: {integrity: sha512-me2VZyr3OjqRpFrYQJJYy7x/zbFSl9nt+MAGnIcBtjDsN00iTVqEaKxBjPBFQV9BDAgPz2SRWes/DhhVm5SmMw==}
695 | engines: {node: '>=10'}
696 | requiresBuild: true
697 | peerDependencies:
698 | '@swc/helpers': ^0.5.0
699 | peerDependenciesMeta:
700 | '@swc/helpers':
701 | optional: true
702 | dependencies:
703 | '@swc/counter': 0.1.2
704 | '@swc/types': 0.1.5
705 | optionalDependencies:
706 | '@swc/core-darwin-arm64': 1.3.105
707 | '@swc/core-darwin-x64': 1.3.105
708 | '@swc/core-linux-arm-gnueabihf': 1.3.105
709 | '@swc/core-linux-arm64-gnu': 1.3.105
710 | '@swc/core-linux-arm64-musl': 1.3.105
711 | '@swc/core-linux-x64-gnu': 1.3.105
712 | '@swc/core-linux-x64-musl': 1.3.105
713 | '@swc/core-win32-arm64-msvc': 1.3.105
714 | '@swc/core-win32-ia32-msvc': 1.3.105
715 | '@swc/core-win32-x64-msvc': 1.3.105
716 | dev: true
717 |
718 | /@swc/counter@0.1.2:
719 | resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==}
720 | dev: true
721 |
722 | /@swc/types@0.1.5:
723 | resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==}
724 | dev: true
725 |
726 | /@types/draco3d@1.4.9:
727 | resolution: {integrity: sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==}
728 | dev: false
729 |
730 | /@types/estree@1.0.5:
731 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
732 | dev: true
733 |
734 | /@types/json-schema@7.0.15:
735 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
736 | dev: true
737 |
738 | /@types/offscreencanvas@2019.7.3:
739 | resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==}
740 | dev: false
741 |
742 | /@types/prop-types@15.7.11:
743 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
744 |
745 | /@types/react-dom@18.2.18:
746 | resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==}
747 | dependencies:
748 | '@types/react': 18.2.48
749 | dev: true
750 |
751 | /@types/react-reconciler@0.26.7:
752 | resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==}
753 | dependencies:
754 | '@types/react': 18.2.48
755 | dev: false
756 |
757 | /@types/react-reconciler@0.28.8:
758 | resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==}
759 | dependencies:
760 | '@types/react': 18.2.48
761 | dev: false
762 |
763 | /@types/react@18.2.48:
764 | resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==}
765 | dependencies:
766 | '@types/prop-types': 15.7.11
767 | '@types/scheduler': 0.16.8
768 | csstype: 3.1.3
769 |
770 | /@types/scheduler@0.16.8:
771 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
772 |
773 | /@types/semver@7.5.6:
774 | resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==}
775 | dev: true
776 |
777 | /@types/stats.js@0.17.3:
778 | resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==}
779 |
780 | /@types/three@0.160.0:
781 | resolution: {integrity: sha512-jWlbUBovicUKaOYxzgkLlhkiEQJkhCVvg4W2IYD2trqD2om3VK4DGLpHH5zQHNr7RweZK/5re/4IVhbhvxbV9w==}
782 | dependencies:
783 | '@types/stats.js': 0.17.3
784 | '@types/webxr': 0.5.11
785 | fflate: 0.6.10
786 | meshoptimizer: 0.18.1
787 |
788 | /@types/webxr@0.5.11:
789 | resolution: {integrity: sha512-bo3K4UFBwP1RbMjuMin9cgyThD5YxjIWjQHJT7O7PVU2DB81qop7JnZAXRmrrGPbEsoHcdUmjmQDXI6zfqkVIQ==}
790 |
791 | /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3):
792 | resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==}
793 | engines: {node: ^16.0.0 || >=18.0.0}
794 | peerDependencies:
795 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
796 | eslint: ^7.0.0 || ^8.0.0
797 | typescript: '*'
798 | peerDependenciesMeta:
799 | typescript:
800 | optional: true
801 | dependencies:
802 | '@eslint-community/regexpp': 4.10.0
803 | '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
804 | '@typescript-eslint/scope-manager': 6.19.1
805 | '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
806 | '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
807 | '@typescript-eslint/visitor-keys': 6.19.1
808 | debug: 4.3.4
809 | eslint: 8.56.0
810 | graphemer: 1.4.0
811 | ignore: 5.3.0
812 | natural-compare: 1.4.0
813 | semver: 7.5.4
814 | ts-api-utils: 1.0.3(typescript@5.3.3)
815 | typescript: 5.3.3
816 | transitivePeerDependencies:
817 | - supports-color
818 | dev: true
819 |
820 | /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3):
821 | resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==}
822 | engines: {node: ^16.0.0 || >=18.0.0}
823 | peerDependencies:
824 | eslint: ^7.0.0 || ^8.0.0
825 | typescript: '*'
826 | peerDependenciesMeta:
827 | typescript:
828 | optional: true
829 | dependencies:
830 | '@typescript-eslint/scope-manager': 6.19.1
831 | '@typescript-eslint/types': 6.19.1
832 | '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
833 | '@typescript-eslint/visitor-keys': 6.19.1
834 | debug: 4.3.4
835 | eslint: 8.56.0
836 | typescript: 5.3.3
837 | transitivePeerDependencies:
838 | - supports-color
839 | dev: true
840 |
841 | /@typescript-eslint/scope-manager@6.19.1:
842 | resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==}
843 | engines: {node: ^16.0.0 || >=18.0.0}
844 | dependencies:
845 | '@typescript-eslint/types': 6.19.1
846 | '@typescript-eslint/visitor-keys': 6.19.1
847 | dev: true
848 |
849 | /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3):
850 | resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==}
851 | engines: {node: ^16.0.0 || >=18.0.0}
852 | peerDependencies:
853 | eslint: ^7.0.0 || ^8.0.0
854 | typescript: '*'
855 | peerDependenciesMeta:
856 | typescript:
857 | optional: true
858 | dependencies:
859 | '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
860 | '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
861 | debug: 4.3.4
862 | eslint: 8.56.0
863 | ts-api-utils: 1.0.3(typescript@5.3.3)
864 | typescript: 5.3.3
865 | transitivePeerDependencies:
866 | - supports-color
867 | dev: true
868 |
869 | /@typescript-eslint/types@6.19.1:
870 | resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==}
871 | engines: {node: ^16.0.0 || >=18.0.0}
872 | dev: true
873 |
874 | /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3):
875 | resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==}
876 | engines: {node: ^16.0.0 || >=18.0.0}
877 | peerDependencies:
878 | typescript: '*'
879 | peerDependenciesMeta:
880 | typescript:
881 | optional: true
882 | dependencies:
883 | '@typescript-eslint/types': 6.19.1
884 | '@typescript-eslint/visitor-keys': 6.19.1
885 | debug: 4.3.4
886 | globby: 11.1.0
887 | is-glob: 4.0.3
888 | minimatch: 9.0.3
889 | semver: 7.5.4
890 | ts-api-utils: 1.0.3(typescript@5.3.3)
891 | typescript: 5.3.3
892 | transitivePeerDependencies:
893 | - supports-color
894 | dev: true
895 |
896 | /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3):
897 | resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==}
898 | engines: {node: ^16.0.0 || >=18.0.0}
899 | peerDependencies:
900 | eslint: ^7.0.0 || ^8.0.0
901 | dependencies:
902 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
903 | '@types/json-schema': 7.0.15
904 | '@types/semver': 7.5.6
905 | '@typescript-eslint/scope-manager': 6.19.1
906 | '@typescript-eslint/types': 6.19.1
907 | '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
908 | eslint: 8.56.0
909 | semver: 7.5.4
910 | transitivePeerDependencies:
911 | - supports-color
912 | - typescript
913 | dev: true
914 |
915 | /@typescript-eslint/visitor-keys@6.19.1:
916 | resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==}
917 | engines: {node: ^16.0.0 || >=18.0.0}
918 | dependencies:
919 | '@typescript-eslint/types': 6.19.1
920 | eslint-visitor-keys: 3.4.3
921 | dev: true
922 |
923 | /@uidotdev/usehooks@2.4.1(react-dom@18.2.0)(react@18.2.0):
924 | resolution: {integrity: sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==}
925 | engines: {node: '>=16'}
926 | peerDependencies:
927 | react: '>=18.0.0'
928 | react-dom: '>=18.0.0'
929 | dependencies:
930 | react: 18.2.0
931 | react-dom: 18.2.0(react@18.2.0)
932 | dev: false
933 |
934 | /@ungap/structured-clone@1.2.0:
935 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
936 | dev: true
937 |
938 | /@use-gesture/core@10.3.0:
939 | resolution: {integrity: sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==}
940 | dev: false
941 |
942 | /@use-gesture/react@10.3.0(react@18.2.0):
943 | resolution: {integrity: sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==}
944 | peerDependencies:
945 | react: '>= 16.8.0'
946 | dependencies:
947 | '@use-gesture/core': 10.3.0
948 | react: 18.2.0
949 | dev: false
950 |
951 | /@vitejs/plugin-react-swc@3.5.0(vite@5.0.12):
952 | resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==}
953 | peerDependencies:
954 | vite: ^4 || ^5
955 | dependencies:
956 | '@swc/core': 1.3.105
957 | vite: 5.0.12(sass@1.70.0)
958 | transitivePeerDependencies:
959 | - '@swc/helpers'
960 | dev: true
961 |
962 | /acorn-jsx@5.3.2(acorn@8.11.3):
963 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
964 | peerDependencies:
965 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
966 | dependencies:
967 | acorn: 8.11.3
968 | dev: true
969 |
970 | /acorn@8.11.3:
971 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
972 | engines: {node: '>=0.4.0'}
973 | hasBin: true
974 | dev: true
975 |
976 | /ajv@6.12.6:
977 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
978 | dependencies:
979 | fast-deep-equal: 3.1.3
980 | fast-json-stable-stringify: 2.1.0
981 | json-schema-traverse: 0.4.1
982 | uri-js: 4.4.1
983 | dev: true
984 |
985 | /ansi-regex@5.0.1:
986 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
987 | engines: {node: '>=8'}
988 | dev: true
989 |
990 | /ansi-styles@4.3.0:
991 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
992 | engines: {node: '>=8'}
993 | dependencies:
994 | color-convert: 2.0.1
995 | dev: true
996 |
997 | /anymatch@3.1.3:
998 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
999 | engines: {node: '>= 8'}
1000 | dependencies:
1001 | normalize-path: 3.0.0
1002 | picomatch: 2.3.1
1003 |
1004 | /argparse@2.0.1:
1005 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
1006 | dev: true
1007 |
1008 | /array-union@2.1.0:
1009 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
1010 | engines: {node: '>=8'}
1011 | dev: true
1012 |
1013 | /balanced-match@1.0.2:
1014 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
1015 | dev: true
1016 |
1017 | /base64-js@1.5.1:
1018 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
1019 | dev: false
1020 |
1021 | /bidi-js@1.0.3:
1022 | resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
1023 | dependencies:
1024 | require-from-string: 2.0.2
1025 | dev: false
1026 |
1027 | /binary-extensions@2.2.0:
1028 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
1029 | engines: {node: '>=8'}
1030 |
1031 | /brace-expansion@1.1.11:
1032 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
1033 | dependencies:
1034 | balanced-match: 1.0.2
1035 | concat-map: 0.0.1
1036 | dev: true
1037 |
1038 | /brace-expansion@2.0.1:
1039 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
1040 | dependencies:
1041 | balanced-match: 1.0.2
1042 | dev: true
1043 |
1044 | /braces@3.0.2:
1045 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
1046 | engines: {node: '>=8'}
1047 | dependencies:
1048 | fill-range: 7.0.1
1049 |
1050 | /buffer@6.0.3:
1051 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
1052 | dependencies:
1053 | base64-js: 1.5.1
1054 | ieee754: 1.2.1
1055 | dev: false
1056 |
1057 | /callsites@3.1.0:
1058 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
1059 | engines: {node: '>=6'}
1060 | dev: true
1061 |
1062 | /camera-controls@2.7.3(three@0.160.1):
1063 | resolution: {integrity: sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw==}
1064 | peerDependencies:
1065 | three: '>=0.126.1'
1066 | dependencies:
1067 | three: 0.160.1
1068 | dev: false
1069 |
1070 | /chalk@4.1.2:
1071 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
1072 | engines: {node: '>=10'}
1073 | dependencies:
1074 | ansi-styles: 4.3.0
1075 | supports-color: 7.2.0
1076 | dev: true
1077 |
1078 | /chokidar@3.5.3:
1079 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
1080 | engines: {node: '>= 8.10.0'}
1081 | dependencies:
1082 | anymatch: 3.1.3
1083 | braces: 3.0.2
1084 | glob-parent: 5.1.2
1085 | is-binary-path: 2.1.0
1086 | is-glob: 4.0.3
1087 | normalize-path: 3.0.0
1088 | readdirp: 3.6.0
1089 | optionalDependencies:
1090 | fsevents: 2.3.3
1091 |
1092 | /color-convert@2.0.1:
1093 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1094 | engines: {node: '>=7.0.0'}
1095 | dependencies:
1096 | color-name: 1.1.4
1097 | dev: true
1098 |
1099 | /color-name@1.1.4:
1100 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
1101 | dev: true
1102 |
1103 | /concat-map@0.0.1:
1104 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
1105 | dev: true
1106 |
1107 | /cross-env@7.0.3:
1108 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
1109 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
1110 | hasBin: true
1111 | dependencies:
1112 | cross-spawn: 7.0.3
1113 | dev: false
1114 |
1115 | /cross-spawn@7.0.3:
1116 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
1117 | engines: {node: '>= 8'}
1118 | dependencies:
1119 | path-key: 3.1.1
1120 | shebang-command: 2.0.0
1121 | which: 2.0.2
1122 |
1123 | /csstype@3.1.3:
1124 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
1125 |
1126 | /debounce@1.2.1:
1127 | resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
1128 | dev: false
1129 |
1130 | /debug@4.3.4:
1131 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
1132 | engines: {node: '>=6.0'}
1133 | peerDependencies:
1134 | supports-color: '*'
1135 | peerDependenciesMeta:
1136 | supports-color:
1137 | optional: true
1138 | dependencies:
1139 | ms: 2.1.2
1140 | dev: true
1141 |
1142 | /deep-is@0.1.4:
1143 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1144 | dev: true
1145 |
1146 | /detect-gpu@5.0.37:
1147 | resolution: {integrity: sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw==}
1148 | dependencies:
1149 | webgl-constants: 1.1.1
1150 | dev: false
1151 |
1152 | /dir-glob@3.0.1:
1153 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
1154 | engines: {node: '>=8'}
1155 | dependencies:
1156 | path-type: 4.0.0
1157 | dev: true
1158 |
1159 | /doctrine@3.0.0:
1160 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
1161 | engines: {node: '>=6.0.0'}
1162 | dependencies:
1163 | esutils: 2.0.3
1164 | dev: true
1165 |
1166 | /draco3d@1.5.7:
1167 | resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==}
1168 | dev: false
1169 |
1170 | /esbuild@0.19.12:
1171 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
1172 | engines: {node: '>=12'}
1173 | hasBin: true
1174 | requiresBuild: true
1175 | optionalDependencies:
1176 | '@esbuild/aix-ppc64': 0.19.12
1177 | '@esbuild/android-arm': 0.19.12
1178 | '@esbuild/android-arm64': 0.19.12
1179 | '@esbuild/android-x64': 0.19.12
1180 | '@esbuild/darwin-arm64': 0.19.12
1181 | '@esbuild/darwin-x64': 0.19.12
1182 | '@esbuild/freebsd-arm64': 0.19.12
1183 | '@esbuild/freebsd-x64': 0.19.12
1184 | '@esbuild/linux-arm': 0.19.12
1185 | '@esbuild/linux-arm64': 0.19.12
1186 | '@esbuild/linux-ia32': 0.19.12
1187 | '@esbuild/linux-loong64': 0.19.12
1188 | '@esbuild/linux-mips64el': 0.19.12
1189 | '@esbuild/linux-ppc64': 0.19.12
1190 | '@esbuild/linux-riscv64': 0.19.12
1191 | '@esbuild/linux-s390x': 0.19.12
1192 | '@esbuild/linux-x64': 0.19.12
1193 | '@esbuild/netbsd-x64': 0.19.12
1194 | '@esbuild/openbsd-x64': 0.19.12
1195 | '@esbuild/sunos-x64': 0.19.12
1196 | '@esbuild/win32-arm64': 0.19.12
1197 | '@esbuild/win32-ia32': 0.19.12
1198 | '@esbuild/win32-x64': 0.19.12
1199 | dev: true
1200 |
1201 | /escape-string-regexp@4.0.0:
1202 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1203 | engines: {node: '>=10'}
1204 | dev: true
1205 |
1206 | /eslint-scope@7.2.2:
1207 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
1208 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1209 | dependencies:
1210 | esrecurse: 4.3.0
1211 | estraverse: 5.3.0
1212 | dev: true
1213 |
1214 | /eslint-visitor-keys@3.4.3:
1215 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1216 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1217 | dev: true
1218 |
1219 | /eslint@8.56.0:
1220 | resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
1221 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1222 | hasBin: true
1223 | dependencies:
1224 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
1225 | '@eslint-community/regexpp': 4.10.0
1226 | '@eslint/eslintrc': 2.1.4
1227 | '@eslint/js': 8.56.0
1228 | '@humanwhocodes/config-array': 0.11.14
1229 | '@humanwhocodes/module-importer': 1.0.1
1230 | '@nodelib/fs.walk': 1.2.8
1231 | '@ungap/structured-clone': 1.2.0
1232 | ajv: 6.12.6
1233 | chalk: 4.1.2
1234 | cross-spawn: 7.0.3
1235 | debug: 4.3.4
1236 | doctrine: 3.0.0
1237 | escape-string-regexp: 4.0.0
1238 | eslint-scope: 7.2.2
1239 | eslint-visitor-keys: 3.4.3
1240 | espree: 9.6.1
1241 | esquery: 1.5.0
1242 | esutils: 2.0.3
1243 | fast-deep-equal: 3.1.3
1244 | file-entry-cache: 6.0.1
1245 | find-up: 5.0.0
1246 | glob-parent: 6.0.2
1247 | globals: 13.24.0
1248 | graphemer: 1.4.0
1249 | ignore: 5.3.0
1250 | imurmurhash: 0.1.4
1251 | is-glob: 4.0.3
1252 | is-path-inside: 3.0.3
1253 | js-yaml: 4.1.0
1254 | json-stable-stringify-without-jsonify: 1.0.1
1255 | levn: 0.4.1
1256 | lodash.merge: 4.6.2
1257 | minimatch: 3.1.2
1258 | natural-compare: 1.4.0
1259 | optionator: 0.9.3
1260 | strip-ansi: 6.0.1
1261 | text-table: 0.2.0
1262 | transitivePeerDependencies:
1263 | - supports-color
1264 | dev: true
1265 |
1266 | /espree@9.6.1:
1267 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
1268 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1269 | dependencies:
1270 | acorn: 8.11.3
1271 | acorn-jsx: 5.3.2(acorn@8.11.3)
1272 | eslint-visitor-keys: 3.4.3
1273 | dev: true
1274 |
1275 | /esquery@1.5.0:
1276 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
1277 | engines: {node: '>=0.10'}
1278 | dependencies:
1279 | estraverse: 5.3.0
1280 | dev: true
1281 |
1282 | /esrecurse@4.3.0:
1283 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1284 | engines: {node: '>=4.0'}
1285 | dependencies:
1286 | estraverse: 5.3.0
1287 | dev: true
1288 |
1289 | /estraverse@5.3.0:
1290 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1291 | engines: {node: '>=4.0'}
1292 | dev: true
1293 |
1294 | /esutils@2.0.3:
1295 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1296 | engines: {node: '>=0.10.0'}
1297 | dev: true
1298 |
1299 | /fast-deep-equal@3.1.3:
1300 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1301 | dev: true
1302 |
1303 | /fast-glob@3.3.2:
1304 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
1305 | engines: {node: '>=8.6.0'}
1306 | dependencies:
1307 | '@nodelib/fs.stat': 2.0.5
1308 | '@nodelib/fs.walk': 1.2.8
1309 | glob-parent: 5.1.2
1310 | merge2: 1.4.1
1311 | micromatch: 4.0.5
1312 | dev: true
1313 |
1314 | /fast-json-stable-stringify@2.1.0:
1315 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1316 | dev: true
1317 |
1318 | /fast-levenshtein@2.0.6:
1319 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1320 | dev: true
1321 |
1322 | /fastq@1.16.0:
1323 | resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==}
1324 | dependencies:
1325 | reusify: 1.0.4
1326 | dev: true
1327 |
1328 | /fflate@0.6.10:
1329 | resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==}
1330 |
1331 | /file-entry-cache@6.0.1:
1332 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1333 | engines: {node: ^10.12.0 || >=12.0.0}
1334 | dependencies:
1335 | flat-cache: 3.2.0
1336 | dev: true
1337 |
1338 | /fill-range@7.0.1:
1339 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
1340 | engines: {node: '>=8'}
1341 | dependencies:
1342 | to-regex-range: 5.0.1
1343 |
1344 | /find-up@5.0.0:
1345 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1346 | engines: {node: '>=10'}
1347 | dependencies:
1348 | locate-path: 6.0.0
1349 | path-exists: 4.0.0
1350 | dev: true
1351 |
1352 | /flat-cache@3.2.0:
1353 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
1354 | engines: {node: ^10.12.0 || >=12.0.0}
1355 | dependencies:
1356 | flatted: 3.2.9
1357 | keyv: 4.5.4
1358 | rimraf: 3.0.2
1359 | dev: true
1360 |
1361 | /flatted@3.2.9:
1362 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
1363 | dev: true
1364 |
1365 | /fs.realpath@1.0.0:
1366 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1367 | dev: true
1368 |
1369 | /fsevents@2.3.3:
1370 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1371 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1372 | os: [darwin]
1373 | requiresBuild: true
1374 | optional: true
1375 |
1376 | /glob-parent@5.1.2:
1377 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1378 | engines: {node: '>= 6'}
1379 | dependencies:
1380 | is-glob: 4.0.3
1381 |
1382 | /glob-parent@6.0.2:
1383 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1384 | engines: {node: '>=10.13.0'}
1385 | dependencies:
1386 | is-glob: 4.0.3
1387 | dev: true
1388 |
1389 | /glob@7.2.3:
1390 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1391 | dependencies:
1392 | fs.realpath: 1.0.0
1393 | inflight: 1.0.6
1394 | inherits: 2.0.4
1395 | minimatch: 3.1.2
1396 | once: 1.4.0
1397 | path-is-absolute: 1.0.1
1398 | dev: true
1399 |
1400 | /globals@13.24.0:
1401 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
1402 | engines: {node: '>=8'}
1403 | dependencies:
1404 | type-fest: 0.20.2
1405 | dev: true
1406 |
1407 | /globby@11.1.0:
1408 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
1409 | engines: {node: '>=10'}
1410 | dependencies:
1411 | array-union: 2.1.0
1412 | dir-glob: 3.0.1
1413 | fast-glob: 3.3.2
1414 | ignore: 5.3.0
1415 | merge2: 1.4.1
1416 | slash: 3.0.0
1417 | dev: true
1418 |
1419 | /glsl-noise@0.0.0:
1420 | resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==}
1421 | dev: false
1422 |
1423 | /graphemer@1.4.0:
1424 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1425 | dev: true
1426 |
1427 | /has-flag@4.0.0:
1428 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1429 | engines: {node: '>=8'}
1430 | dev: true
1431 |
1432 | /ieee754@1.2.1:
1433 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
1434 | dev: false
1435 |
1436 | /ignore@5.3.0:
1437 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==}
1438 | engines: {node: '>= 4'}
1439 | dev: true
1440 |
1441 | /immutable@4.3.4:
1442 | resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==}
1443 |
1444 | /import-fresh@3.3.0:
1445 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1446 | engines: {node: '>=6'}
1447 | dependencies:
1448 | parent-module: 1.0.1
1449 | resolve-from: 4.0.0
1450 | dev: true
1451 |
1452 | /imurmurhash@0.1.4:
1453 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1454 | engines: {node: '>=0.8.19'}
1455 | dev: true
1456 |
1457 | /inflight@1.0.6:
1458 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1459 | dependencies:
1460 | once: 1.4.0
1461 | wrappy: 1.0.2
1462 | dev: true
1463 |
1464 | /inherits@2.0.4:
1465 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1466 | dev: true
1467 |
1468 | /is-binary-path@2.1.0:
1469 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
1470 | engines: {node: '>=8'}
1471 | dependencies:
1472 | binary-extensions: 2.2.0
1473 |
1474 | /is-extglob@2.1.1:
1475 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1476 | engines: {node: '>=0.10.0'}
1477 |
1478 | /is-glob@4.0.3:
1479 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1480 | engines: {node: '>=0.10.0'}
1481 | dependencies:
1482 | is-extglob: 2.1.1
1483 |
1484 | /is-number@7.0.0:
1485 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1486 | engines: {node: '>=0.12.0'}
1487 |
1488 | /is-path-inside@3.0.3:
1489 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
1490 | engines: {node: '>=8'}
1491 | dev: true
1492 |
1493 | /isexe@2.0.0:
1494 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1495 |
1496 | /its-fine@1.1.1(react@18.2.0):
1497 | resolution: {integrity: sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==}
1498 | peerDependencies:
1499 | react: '>=18.0'
1500 | dependencies:
1501 | '@types/react-reconciler': 0.28.8
1502 | react: 18.2.0
1503 | dev: false
1504 |
1505 | /js-tokens@4.0.0:
1506 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1507 | dev: false
1508 |
1509 | /js-yaml@4.1.0:
1510 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1511 | hasBin: true
1512 | dependencies:
1513 | argparse: 2.0.1
1514 | dev: true
1515 |
1516 | /json-buffer@3.0.1:
1517 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1518 | dev: true
1519 |
1520 | /json-schema-traverse@0.4.1:
1521 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1522 | dev: true
1523 |
1524 | /json-stable-stringify-without-jsonify@1.0.1:
1525 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1526 | dev: true
1527 |
1528 | /keyv@4.5.4:
1529 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1530 | dependencies:
1531 | json-buffer: 3.0.1
1532 | dev: true
1533 |
1534 | /levn@0.4.1:
1535 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1536 | engines: {node: '>= 0.8.0'}
1537 | dependencies:
1538 | prelude-ls: 1.2.1
1539 | type-check: 0.4.0
1540 | dev: true
1541 |
1542 | /locate-path@6.0.0:
1543 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1544 | engines: {node: '>=10'}
1545 | dependencies:
1546 | p-locate: 5.0.0
1547 | dev: true
1548 |
1549 | /lodash.merge@4.6.2:
1550 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1551 | dev: true
1552 |
1553 | /loose-envify@1.4.0:
1554 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
1555 | hasBin: true
1556 | dependencies:
1557 | js-tokens: 4.0.0
1558 | dev: false
1559 |
1560 | /lru-cache@6.0.0:
1561 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
1562 | engines: {node: '>=10'}
1563 | dependencies:
1564 | yallist: 4.0.0
1565 | dev: true
1566 |
1567 | /maath@0.10.7(@types/three@0.160.0)(three@0.160.1):
1568 | resolution: {integrity: sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==}
1569 | peerDependencies:
1570 | '@types/three': '>=0.144.0'
1571 | three: '>=0.144.0'
1572 | dependencies:
1573 | '@types/three': 0.160.0
1574 | three: 0.160.1
1575 | dev: false
1576 |
1577 | /merge2@1.4.1:
1578 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1579 | engines: {node: '>= 8'}
1580 | dev: true
1581 |
1582 | /meshline@3.1.7(three@0.160.1):
1583 | resolution: {integrity: sha512-uf9fPI9wy0Ie0kZjvKuIkf2n7gi3ih0wdTeb/kmSvmzpPyEL5d9lFohg9+JV9VC4sQUBOZDgxu6fnjn57goSHg==}
1584 | peerDependencies:
1585 | three: '>=0.137'
1586 | dependencies:
1587 | three: 0.160.1
1588 | dev: false
1589 |
1590 | /meshoptimizer@0.18.1:
1591 | resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==}
1592 |
1593 | /micromatch@4.0.5:
1594 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1595 | engines: {node: '>=8.6'}
1596 | dependencies:
1597 | braces: 3.0.2
1598 | picomatch: 2.3.1
1599 | dev: true
1600 |
1601 | /minimatch@3.1.2:
1602 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1603 | dependencies:
1604 | brace-expansion: 1.1.11
1605 | dev: true
1606 |
1607 | /minimatch@9.0.3:
1608 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
1609 | engines: {node: '>=16 || 14 >=14.17'}
1610 | dependencies:
1611 | brace-expansion: 2.0.1
1612 | dev: true
1613 |
1614 | /ms@2.1.2:
1615 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1616 | dev: true
1617 |
1618 | /nanoid@3.3.7:
1619 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
1620 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1621 | hasBin: true
1622 | dev: true
1623 |
1624 | /natural-compare@1.4.0:
1625 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1626 | dev: true
1627 |
1628 | /normalize-path@3.0.0:
1629 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1630 | engines: {node: '>=0.10.0'}
1631 |
1632 | /object-assign@4.1.1:
1633 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1634 | engines: {node: '>=0.10.0'}
1635 | dev: false
1636 |
1637 | /once@1.4.0:
1638 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1639 | dependencies:
1640 | wrappy: 1.0.2
1641 | dev: true
1642 |
1643 | /optionator@0.9.3:
1644 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
1645 | engines: {node: '>= 0.8.0'}
1646 | dependencies:
1647 | '@aashutoshrathi/word-wrap': 1.2.6
1648 | deep-is: 0.1.4
1649 | fast-levenshtein: 2.0.6
1650 | levn: 0.4.1
1651 | prelude-ls: 1.2.1
1652 | type-check: 0.4.0
1653 | dev: true
1654 |
1655 | /p-limit@3.1.0:
1656 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1657 | engines: {node: '>=10'}
1658 | dependencies:
1659 | yocto-queue: 0.1.0
1660 | dev: true
1661 |
1662 | /p-locate@5.0.0:
1663 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1664 | engines: {node: '>=10'}
1665 | dependencies:
1666 | p-limit: 3.1.0
1667 | dev: true
1668 |
1669 | /parent-module@1.0.1:
1670 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1671 | engines: {node: '>=6'}
1672 | dependencies:
1673 | callsites: 3.1.0
1674 | dev: true
1675 |
1676 | /path-exists@4.0.0:
1677 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1678 | engines: {node: '>=8'}
1679 | dev: true
1680 |
1681 | /path-is-absolute@1.0.1:
1682 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1683 | engines: {node: '>=0.10.0'}
1684 | dev: true
1685 |
1686 | /path-key@3.1.1:
1687 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1688 | engines: {node: '>=8'}
1689 |
1690 | /path-type@4.0.0:
1691 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
1692 | engines: {node: '>=8'}
1693 | dev: true
1694 |
1695 | /picocolors@1.0.0:
1696 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1697 | dev: true
1698 |
1699 | /picomatch@2.3.1:
1700 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1701 | engines: {node: '>=8.6'}
1702 |
1703 | /postcss@8.4.33:
1704 | resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==}
1705 | engines: {node: ^10 || ^12 || >=14}
1706 | dependencies:
1707 | nanoid: 3.3.7
1708 | picocolors: 1.0.0
1709 | source-map-js: 1.0.2
1710 | dev: true
1711 |
1712 | /potpack@1.0.2:
1713 | resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==}
1714 | dev: false
1715 |
1716 | /prelude-ls@1.2.1:
1717 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1718 | engines: {node: '>= 0.8.0'}
1719 | dev: true
1720 |
1721 | /prop-types@15.8.1:
1722 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
1723 | dependencies:
1724 | loose-envify: 1.4.0
1725 | object-assign: 4.1.1
1726 | react-is: 16.13.1
1727 | dev: false
1728 |
1729 | /punycode@2.3.1:
1730 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1731 | engines: {node: '>=6'}
1732 | dev: true
1733 |
1734 | /queue-microtask@1.2.3:
1735 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1736 | dev: true
1737 |
1738 | /react-composer@5.0.3(react@18.2.0):
1739 | resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==}
1740 | peerDependencies:
1741 | react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
1742 | dependencies:
1743 | prop-types: 15.8.1
1744 | react: 18.2.0
1745 | dev: false
1746 |
1747 | /react-dom@18.2.0(react@18.2.0):
1748 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
1749 | peerDependencies:
1750 | react: ^18.2.0
1751 | dependencies:
1752 | loose-envify: 1.4.0
1753 | react: 18.2.0
1754 | scheduler: 0.23.0
1755 | dev: false
1756 |
1757 | /react-is@16.13.1:
1758 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
1759 | dev: false
1760 |
1761 | /react-merge-refs@1.1.0:
1762 | resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==}
1763 | dev: false
1764 |
1765 | /react-reconciler@0.27.0(react@18.2.0):
1766 | resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==}
1767 | engines: {node: '>=0.10.0'}
1768 | peerDependencies:
1769 | react: ^18.0.0
1770 | dependencies:
1771 | loose-envify: 1.4.0
1772 | react: 18.2.0
1773 | scheduler: 0.21.0
1774 | dev: false
1775 |
1776 | /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0):
1777 | resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==}
1778 | peerDependencies:
1779 | react: '>=16.13'
1780 | react-dom: '>=16.13'
1781 | dependencies:
1782 | debounce: 1.2.1
1783 | react: 18.2.0
1784 | react-dom: 18.2.0(react@18.2.0)
1785 | dev: false
1786 |
1787 | /react@18.2.0:
1788 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
1789 | engines: {node: '>=0.10.0'}
1790 | dependencies:
1791 | loose-envify: 1.4.0
1792 | dev: false
1793 |
1794 | /readdirp@3.6.0:
1795 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1796 | engines: {node: '>=8.10.0'}
1797 | dependencies:
1798 | picomatch: 2.3.1
1799 |
1800 | /regenerator-runtime@0.14.1:
1801 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
1802 | dev: false
1803 |
1804 | /require-from-string@2.0.2:
1805 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
1806 | engines: {node: '>=0.10.0'}
1807 | dev: false
1808 |
1809 | /resolve-from@4.0.0:
1810 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1811 | engines: {node: '>=4'}
1812 | dev: true
1813 |
1814 | /reusify@1.0.4:
1815 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1816 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1817 | dev: true
1818 |
1819 | /rimraf@3.0.2:
1820 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1821 | hasBin: true
1822 | dependencies:
1823 | glob: 7.2.3
1824 | dev: true
1825 |
1826 | /rollup@4.9.6:
1827 | resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==}
1828 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1829 | hasBin: true
1830 | dependencies:
1831 | '@types/estree': 1.0.5
1832 | optionalDependencies:
1833 | '@rollup/rollup-android-arm-eabi': 4.9.6
1834 | '@rollup/rollup-android-arm64': 4.9.6
1835 | '@rollup/rollup-darwin-arm64': 4.9.6
1836 | '@rollup/rollup-darwin-x64': 4.9.6
1837 | '@rollup/rollup-linux-arm-gnueabihf': 4.9.6
1838 | '@rollup/rollup-linux-arm64-gnu': 4.9.6
1839 | '@rollup/rollup-linux-arm64-musl': 4.9.6
1840 | '@rollup/rollup-linux-riscv64-gnu': 4.9.6
1841 | '@rollup/rollup-linux-x64-gnu': 4.9.6
1842 | '@rollup/rollup-linux-x64-musl': 4.9.6
1843 | '@rollup/rollup-win32-arm64-msvc': 4.9.6
1844 | '@rollup/rollup-win32-ia32-msvc': 4.9.6
1845 | '@rollup/rollup-win32-x64-msvc': 4.9.6
1846 | fsevents: 2.3.3
1847 | dev: true
1848 |
1849 | /run-parallel@1.2.0:
1850 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1851 | dependencies:
1852 | queue-microtask: 1.2.3
1853 | dev: true
1854 |
1855 | /sass@1.70.0:
1856 | resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==}
1857 | engines: {node: '>=14.0.0'}
1858 | hasBin: true
1859 | dependencies:
1860 | chokidar: 3.5.3
1861 | immutable: 4.3.4
1862 | source-map-js: 1.0.2
1863 |
1864 | /scheduler@0.21.0:
1865 | resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==}
1866 | dependencies:
1867 | loose-envify: 1.4.0
1868 | dev: false
1869 |
1870 | /scheduler@0.23.0:
1871 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
1872 | dependencies:
1873 | loose-envify: 1.4.0
1874 | dev: false
1875 |
1876 | /semver@7.5.4:
1877 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
1878 | engines: {node: '>=10'}
1879 | hasBin: true
1880 | dependencies:
1881 | lru-cache: 6.0.0
1882 | dev: true
1883 |
1884 | /shebang-command@2.0.0:
1885 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1886 | engines: {node: '>=8'}
1887 | dependencies:
1888 | shebang-regex: 3.0.0
1889 |
1890 | /shebang-regex@3.0.0:
1891 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1892 | engines: {node: '>=8'}
1893 |
1894 | /slash@3.0.0:
1895 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1896 | engines: {node: '>=8'}
1897 | dev: true
1898 |
1899 | /source-map-js@1.0.2:
1900 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1901 | engines: {node: '>=0.10.0'}
1902 |
1903 | /stats-gl@2.0.1:
1904 | resolution: {integrity: sha512-EhFm1AxoSBK3MflkFawZ4jmOX1dWu0nBAtCpvGxGsondEvCpsohbpRpM8pi8UAcxG5eRsDsCiRcxdH20j3Rp9A==}
1905 | dev: false
1906 |
1907 | /stats.js@0.17.0:
1908 | resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==}
1909 | dev: false
1910 |
1911 | /strip-ansi@6.0.1:
1912 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1913 | engines: {node: '>=8'}
1914 | dependencies:
1915 | ansi-regex: 5.0.1
1916 | dev: true
1917 |
1918 | /strip-json-comments@3.1.1:
1919 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1920 | engines: {node: '>=8'}
1921 | dev: true
1922 |
1923 | /supports-color@7.2.0:
1924 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1925 | engines: {node: '>=8'}
1926 | dependencies:
1927 | has-flag: 4.0.0
1928 | dev: true
1929 |
1930 | /suspend-react@0.1.3(react@18.2.0):
1931 | resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==}
1932 | peerDependencies:
1933 | react: '>=17.0'
1934 | dependencies:
1935 | react: 18.2.0
1936 | dev: false
1937 |
1938 | /text-table@0.2.0:
1939 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
1940 | dev: true
1941 |
1942 | /three-mesh-bvh@0.7.0(three@0.160.1):
1943 | resolution: {integrity: sha512-Hj0Z1Rp02yy5H+/xtMBu/dYAeRsSONaBaVLZoST9sMpZxycHypRiUeMHucPOLWFHnpc5hwelOnONcLpkfhDg0Q==}
1944 | peerDependencies:
1945 | three: '>= 0.151.0'
1946 | dependencies:
1947 | three: 0.160.1
1948 | dev: false
1949 |
1950 | /three-stdlib@2.29.4(three@0.160.1):
1951 | resolution: {integrity: sha512-XNzGCrz/uAk9XoLwd35eN7dQyI4ggXZTeqjcN034YdYBpBlNO9kmLHehl/0Nw9jCelblB7jla+unHAOIyLyV6Q==}
1952 | peerDependencies:
1953 | three: '>=0.128.0'
1954 | dependencies:
1955 | '@types/draco3d': 1.4.9
1956 | '@types/offscreencanvas': 2019.7.3
1957 | '@types/webxr': 0.5.11
1958 | draco3d: 1.5.7
1959 | fflate: 0.6.10
1960 | potpack: 1.0.2
1961 | three: 0.160.1
1962 | dev: false
1963 |
1964 | /three@0.160.1:
1965 | resolution: {integrity: sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ==}
1966 | dev: false
1967 |
1968 | /to-regex-range@5.0.1:
1969 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1970 | engines: {node: '>=8.0'}
1971 | dependencies:
1972 | is-number: 7.0.0
1973 |
1974 | /troika-three-text@0.47.2(three@0.160.1):
1975 | resolution: {integrity: sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==}
1976 | peerDependencies:
1977 | three: '>=0.125.0'
1978 | dependencies:
1979 | bidi-js: 1.0.3
1980 | three: 0.160.1
1981 | troika-three-utils: 0.47.2(three@0.160.1)
1982 | troika-worker-utils: 0.47.2
1983 | webgl-sdf-generator: 1.1.1
1984 | dev: false
1985 |
1986 | /troika-three-utils@0.47.2(three@0.160.1):
1987 | resolution: {integrity: sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==}
1988 | peerDependencies:
1989 | three: '>=0.125.0'
1990 | dependencies:
1991 | three: 0.160.1
1992 | dev: false
1993 |
1994 | /troika-worker-utils@0.47.2:
1995 | resolution: {integrity: sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==}
1996 | dev: false
1997 |
1998 | /ts-api-utils@1.0.3(typescript@5.3.3):
1999 | resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
2000 | engines: {node: '>=16.13.0'}
2001 | peerDependencies:
2002 | typescript: '>=4.2.0'
2003 | dependencies:
2004 | typescript: 5.3.3
2005 | dev: true
2006 |
2007 | /tunnel-rat@0.1.2(@types/react@18.2.48)(react@18.2.0):
2008 | resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==}
2009 | dependencies:
2010 | zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0)
2011 | transitivePeerDependencies:
2012 | - '@types/react'
2013 | - immer
2014 | - react
2015 | dev: false
2016 |
2017 | /type-check@0.4.0:
2018 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2019 | engines: {node: '>= 0.8.0'}
2020 | dependencies:
2021 | prelude-ls: 1.2.1
2022 | dev: true
2023 |
2024 | /type-fest@0.20.2:
2025 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
2026 | engines: {node: '>=10'}
2027 | dev: true
2028 |
2029 | /typescript@5.3.3:
2030 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
2031 | engines: {node: '>=14.17'}
2032 | hasBin: true
2033 | dev: true
2034 |
2035 | /uri-js@4.4.1:
2036 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
2037 | dependencies:
2038 | punycode: 2.3.1
2039 | dev: true
2040 |
2041 | /use-sync-external-store@1.2.0(react@18.2.0):
2042 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
2043 | peerDependencies:
2044 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
2045 | dependencies:
2046 | react: 18.2.0
2047 | dev: false
2048 |
2049 | /utility-types@3.11.0:
2050 | resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==}
2051 | engines: {node: '>= 4'}
2052 | dev: false
2053 |
2054 | /uuid@9.0.1:
2055 | resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
2056 | hasBin: true
2057 | dev: false
2058 |
2059 | /vite@5.0.12(sass@1.70.0):
2060 | resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==}
2061 | engines: {node: ^18.0.0 || >=20.0.0}
2062 | hasBin: true
2063 | peerDependencies:
2064 | '@types/node': ^18.0.0 || >=20.0.0
2065 | less: '*'
2066 | lightningcss: ^1.21.0
2067 | sass: '*'
2068 | stylus: '*'
2069 | sugarss: '*'
2070 | terser: ^5.4.0
2071 | peerDependenciesMeta:
2072 | '@types/node':
2073 | optional: true
2074 | less:
2075 | optional: true
2076 | lightningcss:
2077 | optional: true
2078 | sass:
2079 | optional: true
2080 | stylus:
2081 | optional: true
2082 | sugarss:
2083 | optional: true
2084 | terser:
2085 | optional: true
2086 | dependencies:
2087 | esbuild: 0.19.12
2088 | postcss: 8.4.33
2089 | rollup: 4.9.6
2090 | sass: 1.70.0
2091 | optionalDependencies:
2092 | fsevents: 2.3.3
2093 | dev: true
2094 |
2095 | /webgl-constants@1.1.1:
2096 | resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==}
2097 | dev: false
2098 |
2099 | /webgl-sdf-generator@1.1.1:
2100 | resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==}
2101 | dev: false
2102 |
2103 | /which@2.0.2:
2104 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2105 | engines: {node: '>= 8'}
2106 | hasBin: true
2107 | dependencies:
2108 | isexe: 2.0.0
2109 |
2110 | /wrappy@1.0.2:
2111 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2112 | dev: true
2113 |
2114 | /yallist@4.0.0:
2115 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
2116 | dev: true
2117 |
2118 | /yocto-queue@0.1.0:
2119 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
2120 | engines: {node: '>=10'}
2121 | dev: true
2122 |
2123 | /zustand@3.7.2(react@18.2.0):
2124 | resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==}
2125 | engines: {node: '>=12.7.0'}
2126 | peerDependencies:
2127 | react: '>=16.8'
2128 | peerDependenciesMeta:
2129 | react:
2130 | optional: true
2131 | dependencies:
2132 | react: 18.2.0
2133 | dev: false
2134 |
2135 | /zustand@4.5.0(@types/react@18.2.48)(react@18.2.0):
2136 | resolution: {integrity: sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A==}
2137 | engines: {node: '>=12.7.0'}
2138 | peerDependencies:
2139 | '@types/react': '>=16.8'
2140 | immer: '>=9.0.6'
2141 | react: '>=16.8'
2142 | peerDependenciesMeta:
2143 | '@types/react':
2144 | optional: true
2145 | immer:
2146 | optional: true
2147 | react:
2148 | optional: true
2149 | dependencies:
2150 | '@types/react': 18.2.48
2151 | react: 18.2.0
2152 | use-sync-external-store: 1.2.0(react@18.2.0)
2153 | dev: false
2154 |
--------------------------------------------------------------------------------